Đây là triển khai thực hiện của tôi về bản đồ ren:
from threading import Thread
from queue import Queue
def thread_map(f, iterable, pool=None):
"""
Just like [f(x) for x in iterable] but each f(x) in a separate thread.
:param f: f
:param iterable: iterable
:param pool: thread pool, infinite by default
:return: list if results
"""
res = {}
if pool is None:
def target(arg, num):
try:
res[num] = f(arg)
except:
res[num] = sys.exc_info()
threads = [Thread(target=target, args=[arg, i]) for i, arg in enumerate(iterable)]
else:
class WorkerThread(Thread):
def run(self):
while True:
try:
num, arg = queue.get(block=False)
try:
res[num] = f(arg)
except:
res[num] = sys.exc_info()
except Empty:
break
queue = Queue()
for i, arg in enumerate(iterable):
queue.put((i, arg))
threads = [WorkerThread() for _ in range(pool)]
[t.start() for t in threads]
[t.join() for t in threads]
return [res[i] for i in range(len(res))]
Bạn có nghĩa là bạn muốn bản đồ để bắt đầu chủ đề (như câu trả lời pillmuncher của, bản đồ (urlopen, url)), hoặc bạn sẽ tự khởi động các chủ đề urlopening, và muốn một cái gì đó giống như bản đồ để hành động trên các kết quả thực hiện mỗi thread, khi họ trở nên có sẵn? – rbp