नीचे मेरी map_parallel
कार्य है। यह map
की तरह काम करता है, सिवाय इसके कि यह प्रत्येक तत्व को एक अलग थ्रेड में समानांतर में चला सकता है (लेकिन नीचे नोट देखें)। यह उत्तर another SO answer पर बनाता है।
import threading
import logging
def map_parallel(f, iter, max_parallel = 10):
"""Just like map(f, iter) but each is done in a separate thread."""
# Put all of the items in the queue, keep track of order.
from queue import Queue, Empty
total_items = 0
queue = Queue()
for i, arg in enumerate(iter):
queue.put((i, arg))
total_items += 1
# No point in creating more thread objects than necessary.
if max_parallel > total_items:
max_parallel = total_items
# The worker thread.
res = {}
errors = {}
class Worker(threading.Thread):
def run(self):
while not errors:
try:
num, arg = queue.get(block = False)
try:
res[num] = f(arg)
except Exception as e:
errors[num] = sys.exc_info()
except Empty:
break
# Create the threads.
threads = [Worker() for _ in range(max_parallel)]
# Start the threads.
[t.start() for t in threads]
# Wait for the threads to finish.
[t.join() for t in threads]
if errors:
if len(errors) > 1:
logging.warning("map_parallel multiple errors: %d:\n%s"%(
len(errors), errors))
# Just raise the first one.
item_i = min(errors.keys())
type, value, tb = errors[item_i]
# Print the original traceback
logging.info("map_parallel exception on item %s/%s:\n%s"%(
item_i, total_items, "\n".join(traceback.format_tb(tb))))
raise value
return [res[i] for i in range(len(res))]
नोट: एक बात का ध्यान के अपवाद है। सामान्य map
की तरह, उपर्युक्त फ़ंक्शन अपवाद उठाता है यदि इसका कोई उप-धागा अपवाद उठाता है, और पुनरावृत्ति को रोक देगा। हालांकि, समानांतर प्रकृति के कारण, इस बात की कोई गारंटी नहीं है कि सबसे पहला तत्व पहला अपवाद उठाएगा।
क्या आपका नक्शा मानचित्र के रूप में कम है? क्या आप इनपुट और आउटपुट पंक्ति का उदाहरण दे सकते हैं? – Simon
नहीं, मेरा मतलब नक्शा कम नहीं है। चूंकि मैं चाहता हूं कि प्रत्येक व्यक्तिगत फ़ंक्शन से सभी डेटा लौटाए। यह सिर्फ इतना है कि प्रत्येक मूल्य को एक-दूसरे से स्वतंत्र रूप से गणना की जा सकती है। हालांकि, मुझे लगता है कि मुझे सेट का अधिकतम भाग चाहिए, शायद मैं नक्शा का उपयोग यहां कम कर सकता हूं ... – Sandro
नक्शा() आप जो भी कहते हैं, वह स्वतंत्र रूप से प्रत्येक तत्व पर काम करेगा (नीचे वर्णित जीआईएल चेतावनी के साथ) –