确定触发连接超时多重处理的原因

问题描述 投票:0回答:1

我正在尝试找出为什么我的多重处理挂起,它不规律,有时它会在 10 分钟后挂起,有时会在几小时后挂起

这是代码的简化版本。我开始工作然后加入工作

jobs = []
for item in items_to_do:
    p = multiprocessing.Process(target=index_a_doc, args=(doc, has_errors))
    jobs.append(p)
    p.start()

for job in jobs:
    job.join(timeout=20)
    if job.is_alive():
        print("TERMINATED")
    else:
        print("Finished OK.  No Timeout")

我添加了连接超时,因为我知道代码有时会挂起。如果挂起 20 秒,则会终止。我的问题是,我是否能够识别代码终止之前的位置(挂在哪里)或停止麻烦的工作然后继续。

所有工作都是相互独立的,实际上并不需要完成

谢谢

格兰特

python multiprocessing timeout
1个回答
0
投票

确切的过程取决于操作系统,但我会模拟按 ctrl-C 来引起键盘中断,就像我正在运行单个进程并想要中断它并查看它在哪里一样。这是 Windows 的解决方案:

from multiprocessing import Process

from time import sleep

import os
import signal

def worker():
    for i in range(5):
        sleep(1) # stack trace should end here
        print(i+1)

if __name__ == "__main__":

    w = Process(target=worker)
    w.start()

    w.join(2)
    if w.is_alive():
        print("stopping w")
        #w.terminate() #no stack trace is printed with sigterm / windows TerminateProcess
        try: #hack from https://stackoverflow.com/questions/58455684/ctrl-c-event-sent-to-child-process-kills-parent-process
            os.kill(w.pid, signal.CTRL_C_EVENT) #traceback should be printed on exception
            sleep(1)
        except KeyboardInterrupt:
            pass

        w.join()
        print("terminated")
    print("done")
© www.soinside.com 2019 - 2024. All rights reserved.