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.workerfuncreturn
.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.