我正在尝试找出为什么我的多重处理挂起,它不规律,有时它会在 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 秒,则会终止。我的问题是,我是否能够识别代码终止之前的位置(挂在哪里)或停止麻烦的工作然后继续。
所有工作都是相互独立的,实际上并不需要完成
谢谢
格兰特
确切的过程取决于操作系统,但我会模拟按 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")