Python multiprocessing.Pool.map不能并行工作
我正在努力实现的目标: 并行化一个函数,每次调用都会产生大量线程,如下所示:Python multiprocessing.Pool.map不能并行工作,python,python-3.x,python-multiprocessing,Python,Python 3.x,Python Multiprocessing,我正在努力实现的目标: 并行化一个函数,每次调用都会产生大量线程,如下所示: - PROCESS01 -> 16 Threads - PROCESS02 -> 16 Threads - ... - PROCESSn -> 16 Threads > PID: 1000 (WAITS UNTIL THE PROCESS FINISHES, THEN START NEXT) > PID: 2000 (WAITS UNTIL THE PROCESS FINISHE
- PROCESS01 -> 16 Threads
- PROCESS02 -> 16 Threads
- ...
- PROCESSn -> 16 Threads
> PID: 1000
(WAITS UNTIL THE PROCESS FINISHES, THEN START NEXT)
> PID: 2000
(WAITS UNTIL THE PROCESS FINISHES, THEN START NEXT)
> PID: 3000
(WAITS UNTIL THE PROCESS FINISHES, THEN START NEXT)
> PID: 3000
(WAITS UNTIL THE PROCESS FINISHES, THEN START NEXT)
守则:
with multiprocessing.Pool(4) as process_pool:
results = process_pool.map(do_stuff, [drain_queue()])
其中drain\u queue()
返回项目列表和
do_stuff(item_list):
print('> PID: ' + str(os.getpid()))
with concurrent.futures.ThreadPoolExecutor(max_workers=16) as executor:
result_dict = {executor.submit(thread_function, item): item for item in item_list}
for future in concurrent.futures.as_completed(result_dict):
pass
和thread\u function()
处理传递给它的每个项目
但是,当执行时,代码输出如下:
- PROCESS01 -> 16 Threads
- PROCESS02 -> 16 Threads
- ...
- PROCESSn -> 16 Threads
> PID: 1000
(WAITS UNTIL THE PROCESS FINISHES, THEN START NEXT)
> PID: 2000
(WAITS UNTIL THE PROCESS FINISHES, THEN START NEXT)
> PID: 3000
(WAITS UNTIL THE PROCESS FINISHES, THEN START NEXT)
> PID: 3000
(WAITS UNTIL THE PROCESS FINISHES, THEN START NEXT)
我错过了什么?我不明白为什么它不能像预期的那样工作。
谢谢 我发现了问题所在。
map()
的第二个参数应该是一个iterable,在我的例子中是一个包含单个对象的列表
怎么了?这是:[drain\u queue()]
,它生成一个包含单个对象的列表
在本例中,代码
with multiprocessing.Pool(4) as process_pool:
results = process_pool.map(do_stuff, [drain_queue()])
强制
multiprocessing.Pool.map
将单个对象“分发”到单个进程,即使它创建了n
个进程,工作仍将由一个进程完成。谢天谢地,与GIL限制无关。我发现了问题所在。map()
的第二个参数应该是一个iterable,在我的例子中是一个包含单个对象的列表
怎么了?这是:[drain\u queue()]
,它生成一个包含单个对象的列表
在本例中,代码
with multiprocessing.Pool(4) as process_pool:
results = process_pool.map(do_stuff, [drain_queue()])
强制
multiprocessing.Pool.map
将单个对象“分发”到单个进程,即使它创建了n
个进程,工作仍将由一个进程完成。谢天谢地,没有GIL限制。线程和进程是完全不同的事情。我不知道你为什么要把它们混在一起。全局解释器锁(GIL)确保一次只有一个线程可以执行字节码,因此串行执行是由GIL引起的,它迫使每个进程等待线程执行?实际上,这是一个好问题。一旦启动多进程,我不确定跨进程的线程操作是否应该相互干扰(如果它们是单独进程的一部分)。我推迟回答,我不能肯定地回答。线程和进程是完全不同的事情。我不知道你为什么要把它们混在一起。全局解释器锁(GIL)确保一次只有一个线程可以执行字节码,因此串行执行是由GIL引起的,它迫使每个进程等待线程执行?实际上,这是一个好问题。一旦启动多进程,我不确定跨进程的线程操作是否应该相互干扰(如果它们是单独进程的一部分)。我推迟回答,我不能肯定地回答。