我使用python 2.7,anaconda2和multiprocessing.Pool()运行python代码,并使用10个cpu工人。该代码从同一文件读取输入(仅在读取模式下打开),并在经过一些处理后输出一些字符串,并且所有输出均被重定向到bash中带有'>'的同一文件。
代码在centos服务器上运行,其他许多进程也在运行。最初所有过程运行良好,但几个小时后陷入睡眠状态。这是进程的状态。
我用 strace 命令查看了正在休眠的进程,发现处于Sl状态的进程被 futex(0x7f861071b000,FUTEX_WAIT,0,NULL 和S状态下的进程被 futex(0x7f861071e000,FUTEX_WAIT,0,NULL 锁定。S状态下的一个进程非常不同,它卡在 read(3,,这是一个管道文件,所以我想多进程会死锁。
def run_multiprocess( parameter_list ):
results = []
multiprocessing.freeze_support()
pool = multiprocessing.Pool(processes=cpus)
for parameter in parameter_list:
result = pool.apply_async(HoloScope, args=parameter[0])
results.append(result)
pool.close()
pool.join()
如果您能帮助我避免所有进程都进入休眠状态,我将不胜感激。
答案 0 :(得分:0)
写入该管道的程序可能停止发送数据,并且对管道的读取调用将阻塞,直到请求的字节数可用或该管道关闭为止。
我的猜测是,写入该管道的程序停止工作,并停止向其中写入数据,但是没有崩溃,因此该管道仍处于打开状态,这使得对其的读取调用将无限期地阻塞。您将不得不检查该程序发生了什么。我不知道您的确切设置,但是使用tee
监视发送的内容可能会有所帮助。
或者这可能是程序的预期行为,并且如果在输入中检测到特定条件,python代码应该已经关闭了管道?没有更多细节就无法确定。