मैं concurrent.futures
और अधिक "उन्नत" नहीं कहूंगा - यह एक सरल इंटरफ़ेस है जो बहुत समान रूप से काम करता है चाहे आप कई थ्रेड या कई प्रक्रियाओं का उपयोग अंतर्निहित समानांतरीकरण नौटंकी के रूप में करें।
इसलिए, "सरल इंटरफ़ेस" के लगभग सभी उदाहरणों की तरह, एक ही ट्रेड-ऑफ्स में बहुत कुछ शामिल है: इसमें एक बड़ा सीखने की अवस्था है, बड़े हिस्से में सिर्फ इसलिए कि सीखने के लिए बहुत कम उपलब्ध है ; लेकिन, क्योंकि यह कम विकल्प प्रदान करता है, यह अंततः आपको उन तरीकों से निराश कर सकता है जो अमीर इंटरफेस नहीं करेंगे।
अभी तक सीपीयू-बाउंड कार्यों के रूप में जाना जाता है, इस तरह से बहुत सार्थक कहने के लिए बहुत ही कम-निर्दिष्ट है। सीपीथॉन के तहत सीपीयू-बाउंड कार्यों के लिए, आपको एक स्पीडअप प्राप्त करने का कोई मौका होने के लिए कई थ्रेड्स के बजाय कई प्रक्रियाओं की आवश्यकता होती है। लेकिन आपके द्वारा प्राप्त किए गए स्पीडअप का कितना (यदि कोई हो) आपके हार्डवेयर, आपके ओएस और विशेष रूप से आपके विशिष्ट कार्यों के लिए कितने अंतर-प्रक्रिया संचार पर निर्भर करता है। कवर के तहत, सभी अंतर-प्रक्रिया समानांतरीकरण चालबाज़ी एक ही OS प्राइमेटीज़ पर निर्भर करती है - जो उच्च-स्तरीय एपीआई आप उन पर प्राप्त करने के लिए उपयोग करते हैं, जो नीचे की लाइन की गति में प्राथमिक कारक नहीं है।
संपादित करें: उदाहरण
यहां आपके द्वारा संदर्भित लेख में दिखाया गया अंतिम कोड है, लेकिन मैं इसे काम करने के लिए आवश्यक आयात विवरण जोड़ रहा हूं:
from concurrent.futures import ProcessPoolExecutor
def pool_factorizer_map(nums, nprocs):
# Let the executor divide the work among processes by using 'map'.
with ProcessPoolExecutor(max_workers=nprocs) as executor:
return {num:factors for num, factors in
zip(nums,
executor.map(factorize_naive, nums))}
यहाँ multiprocessing
इसके बजाय का उपयोग कर बिल्कुल वही है :
import multiprocessing as mp
def mp_factorizer_map(nums, nprocs):
with mp.Pool(nprocs) as pool:
return {num:factors for num, factors in
zip(nums,
pool.map(factorize_naive, nums))}
ध्यान दें कि multiprocessing.Pool
संदर्भ प्रबंधकों के रूप में वस्तुओं का उपयोग करने की क्षमता पायथन 3.3 में जोड़ी गई थी।
किसके साथ काम करना आसान है? LOL ;-) वे अनिवार्य रूप से समान हैं।
एक अंतर यह है कि Pool
चीजों को करने के इतने अलग-अलग तरीकों का समर्थन करता है कि आप महसूस नहीं कर सकते कि यह कितना आसान हो सकता है जब तक कि आप सीखने की अवस्था में काफी ऊपर नहीं चढ़ते।
फिर, वे सभी अलग-अलग तरीके एक ताकत और कमजोरी दोनों हैं। वे एक ताकत हैं क्योंकि लचीलापन कुछ स्थितियों में आवश्यक हो सकता है। वे कमजोरी के कारण "ऐसा करने के लिए केवल एक ही स्पष्ट तरीका है"। एक परियोजना विशेष रूप से (यदि संभव हो तो) concurrent.futures
लंबे समय तक बनाए रखना आसान हो सकता है, क्योंकि इसके न्यूनतम एपीआई का उपयोग कैसे किया जा सकता है, इस बात पर ध्यान देने की आवश्यकता है।