我編寫了以下代碼來理解多進程環境中的 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打?。?/p>
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
提交
取消