Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python multiprocessing.Pool.map不能并行工作_Python_Python 3.x_Python Multiprocessing - Fatal编程技术网

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引起的,它迫使每个进程等待线程执行?实际上,这是一个好问题。一旦启动多进程,我不确定跨进程的线程操作是否应该相互干扰(如果它们是单独进程的一部分)。我推迟回答,我不能肯定地回答。