尝试使用multiprocessing
模块时,Python冻结出现问题。我将Spyder 2.3.2与Python 3.4.3结合使用(我以前遇到过iPython特有的问题)。
我将其简化为以下MWE:导入多处理
def test_function(arg1=1,arg2=2):
print("arg1 = {0}, arg2 = {1}".format(arg1,arg2))
return None
pool = multiprocessing.Pool(processes=3)
for i in range(6):
pool.apply_async(test_function)
pool.close()
pool.join()
以目前的形式,这应该只产生六个相同的test_function迭代。但是,尽管我可以轻松输入命令,但是当我输入命令时pool.join()
,iPython会挂起,并且必须重新启动内核。
串行完成时,该功能可以很好地工作(我的MWE的下一步是使用pool.apply_async(test_function,kwds=entry)
。
for i in range(6):
test_function()
arg_list = [{'arg1':3,'arg2':4},{'arg1':5,'arg2':6},{'arg1':7,'arg2':8}]
for entry in arg_list:
test_function(**entry)
我(有时无法可靠地重现它)遇到了一条错误消息ZMQError: Address already in use
,导致我收到此错误报告,但是在我的代码之前加上multiprocessing.set_start_method('spawn')
或multiprocessing.set_start_method('forkserver')
不起作用。
谁能提供任何帮助/建议?预先感谢,如果是这样。
@Anarkopsykotik是正确的:您必须使用main
,并且可以通过将结果返回到主线程来打印它。
这是一个工作示例。
import multiprocessing
import os
def test_function(arg1=1,arg2=2):
string="arg1 = {0}, arg2 = {1}".format(arg1,arg2) +" from process id: "+ str(os.getpid())
return string
if __name__ == '__main__':
pool = multiprocessing.Pool(processes=3)
for i in range(6):
result = pool.apply_async(test_function)
print(result.get(timeout=1))
pool.close()
pool.join()
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句