multiprocessing.Pool.map不能并行工作

时间:2018-05-06 17:43:11

标签: python python-3.x python-multiprocessing

我想要实现的目标:

并行化每个调用产生多个线程的函数,如下所示:

 - PROCESS01 -> 16 Threads
 - PROCESS02 -> 16 Threads
 - ...
 - PROCESSn -> 16 Threads

代码:

with multiprocessing.Pool(4) as process_pool:
    results = process_pool.map(do_stuff, [drain_queue()])

drain_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_function()处理传递给它的每个项目。

但是,执行时代码输出如下:

> 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)

Here is a screenshot of Task Manager

我在这里缺少什么?我无法弄清楚为什么不按预期工作。 谢谢!

1 个答案:

答案 0 :(得分:1)

我发现了问题。 map()的第二个参数应该是可迭代的,在我的情况下是包含 单个对象的列表。

有什么问题?这个:[drain_queue()],它会生成一个包含单个对象的列表。

在这种情况下,代码

with multiprocessing.Pool(4) as process_pool:
    results = process_pool.map(do_stuff, [drain_queue()])

强制multiprocessing.Pool.map将单个对象“分发”到单个进程,即使它创建了n个进程,但仍然可以通过一个进程完成工作。谢天谢地,没有任何GIL限制。