我编写了以下代码来理解多进程环境中的 sys.excepthook。我正在使用 python 3。我创建了 2 个进程,它们将打印并等待获取 ctrl+c。from multiprocessing import Processimport multiprocessingimport sysfrom time import sleepclass foo: def f(self, name): try: raise ValueError("test value error") except ValueError as e: print(e) print('hello', name) while True: passdef myexcepthook(exctype, value, traceback): print("Value: {}".format(value)) for p in multiprocessing.active_children(): p.terminate()def main(name): a = foo() a.f(name)sys.excepthook = myexcepthookif __name__ == '__main__': for i in range(2): p = Process(target=main, args=('bob', )) p.start()当我按下时,我期待以下结果ctrl+Cpython /home/test/test.pytest value errorhello bobtest value errorhello bobValue: <KeyboardInterrupt>但不幸的是,我得到了以下结果。/home/test/venvPython3/bin/python /home/test/test.pytest value errorhello bobtest value errorhello bobError in atexit._run_exitfuncs:Traceback (most recent call last):Process Process-1: File "/usr/lib/python3.6/multiprocessing/popen_fork.py", line 28, in poll pid, sts = os.waitpid(self.pid, flag)KeyboardInterruptTraceback (most recent call last): File "/usr/lib/python3.6/multiprocessing/process.py", line 258, in _bootstrap self.run() File "/usr/lib/python3.6/multiprocessing/process.py", line 93, in run self._target(*self._args, **self._kwargs) File "/home/test/test.py", line 26, in main a.f(name) File "/home/test/test.py", line 15, in f passKeyboardInterruptProcess Process-2:Traceback (most recent call last): File "/usr/lib/python3.6/multiprocessing/process.py", line 258, in _bootstrap self.run() File "/usr/lib/python3.6/multiprocessing/process.py", line 93, in run self._target(*self._args, **self._kwargs) File "/home/test/test.py", line 26, in main a.f(name) File "/home/test/test.py", line 15, in f passKeyboardInterruptProcess finished with exit code 0如果有人能指出我做错了什么,那将是一个很大的帮助。另外,请让我知道如何获得预期的输出。
1 回答
蝴蝶不菲
TA贡献1810条经验 获得超4个赞
你几乎做到了。首先,使用exctype打印:
def myexcepthook(exctype, value, traceback):
print("Value: {}".format(exctype))
for p in multiprocessing.active_children():
p.terminate()
并join()创建流程,防止过早退出
if __name__ == '__main__':
pr = []
for i in range(2):
p = Process(target=main, args=('bob', ))
p.start()
pr.append(p)
for p in pr:
p.join()
添加回答
举报
0/150
提交
取消