繁体   English   中英

Python multiprocessing.Pool不会立即启动

[英]Python multiprocessing.Pool does not start right away

我想将文本输入到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,))

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

python3 test.py
In: a
In: a
In: a
In: Out: a
Out: a
Out: a

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

有人对此行为有解释吗?

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


编辑:

一个更简单的示例,包含Pool和ProcessPoolExecutor。 我认为问题是在appyling / submitting之后调用input() ,这在第一次appyling / submitting时似乎只是一个问题。

import concurrent.futures
import multiprocessing as mp
import time

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

# ProcessPoolExecutor
# if __name__ == '__main__':
#     with concurrent.futures.ProcessPoolExecutor() as executor:
#         executor.submit(do_something, 'a')
#         input('In:')
#         print('done')

# Pool
if __name__ == '__main__':
    p = mp.Pool()
    p.apply_async(do_something, ('a',))
    input('In:')
    p.close()
    p.join()
    print('done')

我在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,))

我无法在Windows 7上重现它,但很少有值得提及的长镜头。

  1. 您的AV可能会干扰新生成的进程,请尝试暂时禁用它并查看问题是否仍然存在。
  2. Win 10可能有不同的IO缓存算法,尝试输入更大的字符串。 如果它有效,则意味着操作系统会尝试智能并在某个数量累积时发送数据。
  3. 由于Windows没有fork()原语,您可能会看到由spawn启动方法引起的延迟。
  4. Python 3添加了一个名为ProcessPoolExecutor的新工作池,我建议您使用它,无论您遇到什么问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM