加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Python multiprocessing.Pool不会立即启动

发布时间:2020-12-20 13:11:54 所属栏目:Python 来源:网络整理
导读:我想将文本输入到 python并并行处理它.为此,我使用multiprocessing.Pool.问题是,有时候,并非总是如此,我必须在处理任何内容之前多次输入文本. 这是我的代码的最小版本,以重现问题: import multiprocessing as mpimport timedef do_something(text): print('
我想将文本输入到 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,))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读