คำตอบสำหรับเรื่องนี้คือเวอร์ชั่น - และขึ้นอยู่กับสถานการณ์ คำตอบทั่วไปมากที่สุดสำหรับรุ่นล่าสุดของงูใหญ่ (ตั้งแต่ 3.3) เป็นครั้งแรกที่อธิบายไว้ด้านล่างโดยJF เซบาสเตียน 1มันใช้Pool.starmap
วิธีการซึ่งยอมรับลำดับของสิ่งอันดับอาร์กิวเมนต์ จากนั้นจะคลายการขัดแย้งจากแต่ละทูเปิลและส่งผ่านไปยังฟังก์ชันที่กำหนด:
import multiprocessing
from itertools import product
def merge_names(a, b):
return '{} & {}'.format(a, b)
if __name__ == '__main__':
names = ['Brown', 'Wilson', 'Bartlett', 'Rivera', 'Molloy', 'Opie']
with multiprocessing.Pool(processes=3) as pool:
results = pool.starmap(merge_names, product(names, repeat=2))
print(results)
# Output: ['Brown & Brown', 'Brown & Wilson', 'Brown & Bartlett', ...
สำหรับ Python เวอร์ชันก่อนหน้าคุณจะต้องเขียนฟังก์ชันตัวช่วยเพื่อคลายข้อโต้แย้งอย่างชัดเจน หากคุณต้องการใช้with
คุณจะต้องเขียน wrapper เพื่อเปลี่ยนPool
เป็น context manager (ขอบคุณmuon ที่ชี้เรื่องนี้ออกมา)
import multiprocessing
from itertools import product
from contextlib import contextmanager
def merge_names(a, b):
return '{} & {}'.format(a, b)
def merge_names_unpack(args):
return merge_names(*args)
@contextmanager
def poolcontext(*args, **kwargs):
pool = multiprocessing.Pool(*args, **kwargs)
yield pool
pool.terminate()
if __name__ == '__main__':
names = ['Brown', 'Wilson', 'Bartlett', 'Rivera', 'Molloy', 'Opie']
with poolcontext(processes=3) as pool:
results = pool.map(merge_names_unpack, product(names, repeat=2))
print(results)
# Output: ['Brown & Brown', 'Brown & Wilson', 'Brown & Bartlett', ...
ในกรณีที่ง่ายกว่าด้วยอาร์กิวเมนต์ที่สองคงที่คุณสามารถใช้partial
แต่เฉพาะใน Python 2.7+
import multiprocessing
from functools import partial
from contextlib import contextmanager
@contextmanager
def poolcontext(*args, **kwargs):
pool = multiprocessing.Pool(*args, **kwargs)
yield pool
pool.terminate()
def merge_names(a, b):
return '{} & {}'.format(a, b)
if __name__ == '__main__':
names = ['Brown', 'Wilson', 'Bartlett', 'Rivera', 'Molloy', 'Opie']
with poolcontext(processes=3) as pool:
results = pool.map(partial(merge_names, b='Sons'), names)
print(results)
# Output: ['Brown & Sons', 'Wilson & Sons', 'Bartlett & Sons', ...
1. สิ่งนี้ได้รับแรงบันดาลใจจากคำตอบของเขาซึ่งน่าจะได้รับการยอมรับแทน แต่เนื่องจากอันนี้ติดอยู่ที่ด้านบนสุดจึงเป็นการดีที่สุดที่จะปรับปรุงสำหรับผู้อ่านในอนาคต
partial
มิได้lambda
ทำเช่นนี้ ฉันคิดว่ามันเกี่ยวข้องกับวิธีแปลก ๆ ที่ฟังก์ชั่นถูกส่งผ่านไปยังกระบวนการย่อย (ผ่านpickle
)