我想将文本输入到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()
,这似乎只是在第一次修改/提交内容时出现问题。
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')
答案 0 :(得分: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,))
答案 1 :(得分:0)
我无法在Windows 7上重现它,但很少有值得提及的长镜头。