我使用multiprocessing.Pool()运行python代码,所有进程一开始运行良好,但几个小时后所有进程都陷入了睡眠状态

时间:2018-12-24 04:22:24

标签: python multiprocessing

我使用python 2.7,anaconda2和multiprocessing.Pool()运行python代码,并使用10个cpu工人。该代码从同一文件读取输入(仅在读取模式下打开),并在经过一些处理后输出一些字符串,并且所有输出均被重定向到bash中带有'>'的同一文件。

代码在centos服务器上运行,其他许多进程也在运行。最初所有过程运行良好,但几个小时后陷入睡眠状态。这是进程的状态。

state of process

我用 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()

如果您能帮助我避免所有进程都进入休眠状态,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

写入该管道的程序可能停止发送数据,并且对管道的读取调用将阻塞,直到请求的字节数可用或该管道关闭为止。

我的猜测是,写入该管道的程序停止工作,并停止向其中写入数据,但是没有崩溃,因此该管道仍处于打开状态,这使得对其的读取调用将无限期地阻塞。您将不得不检查该程序发生了什么。我不知道您的确切设置,但是使用tee监视发送的内容可能会有所帮助。

或者这可能是程序的预期行为,并且如果在输入中检测到特定条件,python代码应该已经关闭了管道?没有更多细节就无法确定。