Python多处理池不能立即启动

Python多处理池不能立即启动,python,multiprocessing,pool,Python,Multiprocessing,Pool,我想将文本输入python并并行处理它。为此,我使用了多处理.Pool。问题是,有时,并非总是,在处理任何内容之前,我必须多次输入文本 这是我再现问题的代码的最低版本: 将多处理导入为mp 导入时间 def do_某事(文本): 打印('Out:'+文本,flush=True) #在这里做一些很棒的事情 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': p=无 尽管如此: 消息=输入('In:') 如果不是p: p=mp.Pool() p、 应用异步(做某事

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

这是我再现问题的代码的最低版本:

将多处理导入为mp
导入时间
def do_某事(文本):
打印('Out:'+文本,flush=True)
#在这里做一些很棒的事情
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
p=无
尽管如此:
消息=输入('In:')
如果不是p:
p=mp.Pool()
p、 应用异步(做某事,(消息)
发生的事情是,在得到结果之前,我必须多次输入文本,无论我在第一次输入内容后等待多长时间。(如上所述,这种情况并非每次都会发生。)

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

有人解释过这种行为吗

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


编辑:

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

import concurrent.futures
将多处理作为mp导入
导入时间
def do_某事(文本):
打印('Out:'+文本,flush=True)
#在这里做一些很棒的事情
#进程池执行器
#如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
#以concurrent.futures.ProcessPoolExecutor()作为执行器:
#遗嘱执行人。提交(做某事,'a')
#输入('In:')
#打印(‘完成’)
#水池
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
p=mp.Pool()
p、 应用异步(做某事,('a',))
输入('In:')
p、 关闭()
p、 加入
打印(‘完成’)

我在Mac上试用时,您的代码可以正常工作

在Python3中,显式声明池中的处理器数量(即同时进程的数量)可能会有所帮助

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


我无法在Windows7上复制它,但对于您的问题,没有几个长镜头值得一提

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

  • 有趣的是,在我的Linux系统上,它似乎总是像预期的那样立即开始处理输入:我想知道
    flush=True
    是否真的导致输出被刷新?这很容易测试(例如,每次调用
    dou_something
    ,都要创建一个唯一的文件)。@larsks:只是在创建文件时尝试了一下。它会产生相同的行为。@skrrgwasme:在循环中只创建一次池。如果读取了EOF,我真正使用的代码将连接并关闭池。@您是否丢失了第一次输入的输出,或者它来得太晚了?我刚刚输入了“a”、“b”和“c”,它们确实出现得很晚,但我看到三个最终都出现了。您的任何输入都没有完全显示出来吗?@skrrgwsme:是的,输出显示得很晚,但我没有遗漏任何内容。实际上,在它第一次返回某些内容后,它会按预期工作,并立即返回所有内容。1)AV?反病毒?我没有任何东西运行2)通常我使用长度超过1000的字符串。它仍然显示出同样的问题。4) 结果是相同的行为
    python3 test.py
    In: a
    In: a
    In: a
    In: Out: a
    Out: a
    Out: a
    
    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,))