edit
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