Python multiprocessing.Pool 不会立即启动

the*_*the 5 python pool multiprocessing

我想将文本输入到 python 并并行处理它。为此,我使用multiprocessing.Pool. 问题是有时,并非总是如此,我必须在处理任何内容之前多次输入文本。

这是我重现问题的代码的最小版本:

import multiprocessing as mp
import time

def do_something(text):
    print('Out: ' + text, flush=True)
    # do some awesome stuff here

if __name__ == '__main__':
    p = None
    while True:
        message = input('In: ')
        if not p:
            p = mp.Pool()
        p.apply_async(do_something, (message,))
Run Code Online (Sandbox Code Playgroud)

发生的情况是我必须多次输入文本才能得到结果,无论我在第一次输入内容后等待多久。(如上所述,这不会每次都发生。)

python3 test.py
In: a
In: a
In: a
In: Out: a
Out: a
Out: a
Run Code Online (Sandbox Code Playgroud)

如果我在 while 循环之前创建池,或者如果我time.sleep(1)在创建池之后添加,它似乎每次都有效。注意:我不想在获得输入之前创建池。

有人对这种行为有解释吗?

我正在使用 Python 3.4.2 运行 Windows 10 编辑:与 Python 3.5.1 相同的行为


编辑:

一个更简单的例子,包括 Pool 和 ProcessPoolExecutor。我认为问题是input()在申请/提交后立即调用,这似乎只是第一次申请/提交某些东西时的问题。

python3 test.py
In: a
In: a
In: a
In: Out: a
Out: a
Out: a
Run Code Online (Sandbox Code Playgroud)

小智 0

当我在 Mac 上尝试时,你的代码可以运行。

在 Python 3 中,显式声明池中将有多少个处理器(即同时进程的数量)可能会有所帮助。

尝试使用p = mp.Pool(1)

import multiprocessing as mp
import time

def do_something(text):
    print('Out: ' + text, flush=True)
    # do some awesome stuff here

if __name__ == '__main__':
    p = None
    while True:
        message = input('In: ')
        if not p:
            p = mp.Pool(1)
        p.apply_async(do_something, (message,))
Run Code Online (Sandbox Code Playgroud)