multiprocessing.Pool
มีคิวผลลัพธ์ที่แชร์อยู่แล้วไม่จำเป็นต้องเกี่ยวข้องกับไฟล์Manager.Queue
. Manager.Queue
คือqueue.Queue
(คิวหลายเธรด) ที่อยู่ภายใต้ประทุนซึ่งตั้งอยู่บนกระบวนการเซิร์ฟเวอร์ที่แยกจากกันและเปิดเผยผ่านพร็อกซี สิ่งนี้จะเพิ่มค่าใช้จ่ายเพิ่มเติมเมื่อเทียบกับคิวภายในของ Pool ตรงกันข้ามกับการใช้การจัดการผลลัพธ์ดั้งเดิมของ Pool Manager.Queue
แต่ไม่รับประกันว่าจะเรียงลำดับผลลัพธ์ใน
กระบวนการปฏิบัติงานจะไม่ได้เริ่มต้นด้วยการนี้แล้วเกิดขึ้นเมื่อคุณยกตัวอย่าง.apply_async()
Pool
สิ่งที่จะเริ่มต้นเมื่อคุณเรียกpool.apply_async()
เป็น "งาน" ใหม่ กระบวนการทำงานของ Pool เรียกใช้multiprocessing.pool.worker
ฟังก์ชันภายใต้ประทุน ฟังก์ชันนี้จะดูแลการประมวลผล "งาน" ใหม่ที่ถ่ายโอนผ่านภายในพูลPool._inqueue
และการส่งผลลัพธ์กลับไปยังพาเรนPool._outqueue
ต์ ระบุของคุณจะได้รับการดำเนินการภายในfunc
มีเพียงบางอย่างเท่านั้นและผลลัพธ์จะถูกส่งกลับไปยังผู้ปกครองโดยอัตโนมัติmultiprocessing.pool.worker
func
return
.apply_async()
ทันที (แบบอะซิงโครนัส) ส่งคืนAsyncResult
วัตถุ (นามแฝงสำหรับApplyResult
) คุณต้องโทร.get()
(กำลังบล็อก) บนวัตถุนั้นเพื่อรับผลลัพธ์ที่แท้จริง อีกทางเลือกหนึ่งคือการลงทะเบียนฟังก์ชันการโทรกลับซึ่งจะเริ่มทำงานทันทีที่ผลลัพธ์พร้อม
from multiprocessing import Pool
def busy_foo(i):
"""Dummy function simulating cpu-bound work."""
for _ in range(int(10e6)):
pass
return i
if __name__ == '__main__':
with Pool(4) as pool:
print(pool._outqueue)
results = [pool.apply_async(busy_foo, (i,)) for i in range(10)]
print(results[0])
results = [res.get() for res in results]
print(f'result: {results}')
ตัวอย่างผลลัพธ์:
<multiprocessing.queues.SimpleQueue object at 0x7fa124fd67f0>
<multiprocessing.pool.ApplyResult object at 0x7fa12586da20>
result: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
หมายเหตุ: การระบุtimeout
-parameter สำหรับ.get()
จะไม่หยุดการประมวลผลจริงของงานภายในผู้ปฏิบัติงาน แต่จะปลดบล็อกพาเรนต์ที่รออยู่โดยการเพิ่ม a multiprocessing.TimeoutError
.