ทางออกที่ดีที่สุดสำหรับปัญหาของคุณคือใช้ไฟล์Pool
. การใช้Queue
s และมีฟังก์ชัน "การป้อนคิว" แยกกันนั้นอาจจะมากเกินไป
นี่เป็นเวอร์ชันที่ปรับเปลี่ยนใหม่เล็กน้อยของโปรแกรมของคุณคราวนี้มีเพียง 2 กระบวนการที่รวมอยู่ในไฟล์Pool
. ฉันเชื่อว่าเป็นวิธีที่ง่ายที่สุดโดยมีการเปลี่ยนแปลงโค้ดต้นฉบับเพียงเล็กน้อย:
import multiprocessing
import time
data = (
['a', '2'], ['b', '4'], ['c', '6'], ['d', '8'],
['e', '1'], ['f', '3'], ['g', '5'], ['h', '7']
)
def mp_worker((inputs, the_time)):
print " Processs %s\tWaiting %s seconds" % (inputs, the_time)
time.sleep(int(the_time))
print " Process %s\tDONE" % inputs
def mp_handler():
p = multiprocessing.Pool(2)
p.map(mp_worker, data)
if __name__ == '__main__':
mp_handler()
โปรดทราบว่าmp_worker()
ตอนนี้ฟังก์ชันยอมรับอาร์กิวเมนต์เดียว (ทูเพิลจากสองอาร์กิวเมนต์ก่อนหน้า) เนื่องจากmap()
ฟังก์ชันจะรวบรวมข้อมูลอินพุตของคุณไว้ในรายการย่อยโดยแต่ละรายการย่อยจะกำหนดให้เป็นอาร์กิวเมนต์เดียวสำหรับฟังก์ชันผู้ปฏิบัติงานของคุณ
เอาท์พุต:
Processs a Waiting 2 seconds
Processs b Waiting 4 seconds
Process a DONE
Processs c Waiting 6 seconds
Process b DONE
Processs d Waiting 8 seconds
Process c DONE
Processs e Waiting 1 seconds
Process e DONE
Processs f Waiting 3 seconds
Process d DONE
Processs g Waiting 5 seconds
Process f DONE
Processs h Waiting 7 seconds
Process g DONE
Process h DONE
แก้ไขตามความคิดเห็น @Thales ด้านล่าง:
หากคุณต้องการ "ล็อกสำหรับขีด จำกัด พูลแต่ละรายการ" เพื่อให้กระบวนการของคุณทำงานเป็นคู่ควบคู่กัน:
รอ B รออยู่ | เสร็จแล้ว B เสร็จแล้ว | รอ C รอ D รอ | C เสร็จแล้ว D เสร็จแล้ว | ...
จากนั้นเปลี่ยนฟังก์ชันตัวจัดการเพื่อเรียกใช้พูล (จาก 2 กระบวนการ) สำหรับข้อมูลแต่ละคู่:
def mp_handler():
subdata = zip(data[0::2], data[1::2])
for task1, task2 in subdata:
p = multiprocessing.Pool(2)
p.map(mp_worker, (task1, task2))
ตอนนี้ผลลัพธ์ของคุณคือ:
Processs a Waiting 2 seconds
Processs b Waiting 4 seconds
Process a DONE
Process b DONE
Processs c Waiting 6 seconds
Processs d Waiting 8 seconds
Process c DONE
Process d DONE
Processs e Waiting 1 seconds
Processs f Waiting 3 seconds
Process e DONE
Process f DONE
Processs g Waiting 5 seconds
Processs h Waiting 7 seconds
Process g DONE
Process h DONE