Ruby Fork

จากครั้งที่แล้วผมอยากจะเขียน ruby สักอันไว้ทำการ stamp ลายเซ็นพร้อมค่า exif ลงในรูป จากการลองเขียนเป็น thread แล้วปรากฏว่าไม่ค่อยมีประโยชน์เท่าไหร่กลับกลายเป็นว่ามี overhead ขึ้นมาเพียบและก็ทำงานไม่ครบได้ทุก core ที่มี งานส่วนใหญ่ในการทำงานเกี่ยวกับภาพนี่จะเป็นในด้านคำนวนซะเยอะ เลยเขียนเป็นลักษณะ fork ออกมาจะดีกว่า
พอลองได้เขียนก็ได้แนวคิดมา 2 แบบ คือ
  • ทำงานแบบเป็น lot คือทำพร้อมกันที่ละเท่าๆกัน แล้วรอให้เสร็จหมด ค่อยเริ่ม lot ต่อไป แบบนี้ถ้ามี process ใน lot เสร็จก่อนเพื่อนก็ต้องรอ
  • แบบที่สองคือเริ่มทำงานให้เต็มตามที่เรากำหนด ถ้า process ไหนเสร็จก่อนก็เอา process ใหม่มา run ได้เลย แบบนี้จะทำให้การทำงานต่อเนื่อง
แบบนี้คือการทำงานแบบเป็น Lot NUMFORK = 2 getImg = Dir['*.jpg','*.JPG','*.Jpg','*.jpeg'].sort.reverse Dir.mkdir("stamped") if !File.exist?("stamped") numFork = 0 while !getImg.empty? numFork = numFork + 1 photo = getImg.pop Process.fork{stampit(photo)} if numFork == NUMFORK Process.waitall numFork = 0 end end Process.waitall ส่วนแบบนี้คือการทำงานแบบต่อเนื่อง NUMFORK = 2 getImg = Dir['*.jpg','*.JPG','*.Jpg','*.jpeg'].sort.reverse Dir.mkdir("stamped") if !File.exist?("stamped") numFork = 0 while !getImg.empty? numFork = numFork + 1 photo = getImg.pop Process.fork{stampit(photo)} if numFork >= NUMFORK Process.wait numFork = numFork - 1 end end Process.waitall อย่างนี้ก็สบายใช้งานคุ้มทุก core

Posted by Revolution Thu, 04 Sep 2008 16:29:53 GMT

Comments - (Leave a comment)

    Trackbacks

    Use the following link to trackback from your own site:
    /articles/trackback/2196

      Leave a comment