Python 多处理挂在 pool.join()
Python multiprocessing hanging on pool.join()
我在尝试使用 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
的错误消息,这导致我 this bug report,但在我的代码前面加上 multiprocessing.set_start_method('spawn')
或 multiprocessing.set_start_method('forkserver')
似乎不起作用。
任何人都可以提供 help/advice 吗?如果是这样,请提前致谢。
我想到两件事可能会导致问题。
首先,在文档中,有关于使用带有多处理模块的交互式解释器的警告:
https://docs.python.org/2/library/multiprocessing.html#using-a-pool-of-workers
Functionality within this package requires that the main module be importable by the children. This is covered in Programming guidelines however it is worth pointing out here. This means that some examples, such as the Pool examples will not work in the interactive interpreter.
其次:您可能希望使用异步函数检索字符串,然后从主线程中显示它。我不太确定子线程是否可以访问标准输出,这可能会锁定到主线程。
@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()
我在尝试使用 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
的错误消息,这导致我 this bug report,但在我的代码前面加上 multiprocessing.set_start_method('spawn')
或 multiprocessing.set_start_method('forkserver')
似乎不起作用。
任何人都可以提供 help/advice 吗?如果是这样,请提前致谢。
我想到两件事可能会导致问题。 首先,在文档中,有关于使用带有多处理模块的交互式解释器的警告: https://docs.python.org/2/library/multiprocessing.html#using-a-pool-of-workers
Functionality within this package requires that the main module be importable by the children. This is covered in Programming guidelines however it is worth pointing out here. This means that some examples, such as the Pool examples will not work in the interactive interpreter.
其次:您可能希望使用异步函数检索字符串,然后从主线程中显示它。我不太确定子线程是否可以访问标准输出,这可能会锁定到主线程。
@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()