इसका उत्तर संस्करण है- और स्थिति-निर्भर। पायथन के हाल के संस्करणों के लिए सबसे सामान्य उत्तर (3.3 के बाद से) पहले जेएफ सेबेस्टियन द्वारा नीचे वर्णित किया गया था । 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', ...
पायथन के पुराने संस्करणों के लिए, आपको तर्कों को स्पष्ट रूप से अनपैक करने के लिए एक सहायक फ़ंक्शन लिखना होगा। यदि आप उपयोग करना चाहते हैं with
, तो आपको Pool
संदर्भ प्रबंधक में बदलने के लिए एक आवरण लिखना होगा । ( यह इंगित करने के लिए म्यूऑन के लिए धन्यवाद ।)
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
, लेकिन केवल पायथन 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
) में पारित हो जाते हैं ।