Python多处理池不能立即启动
我想将文本输入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、 应用异步(做某事
多处理.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上复制它,但对于您的问题,没有几个长镜头值得一提
有趣的是,在我的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,))