我试图强迫multiprocessing.Process
给我与Python解释器相同的退出代码,但是它的行为取决于我调用sys.exit
的方式。例如:
from multiprocessing import Process
import sys
def run(fn):
p = Process(target=fn)
p.start()
p.join()
return p.exitcode
print(run(lambda: sys.exit(2)))
print(run(lambda: sys.exit(None)))
print(run(lambda: sys.exit()))
执行时产生:
$ python exit.py
2
1
1
但是当我直接执行Python时,我会看到不同的结果:
$ for arg in 2 None ''; do python -c "import sys; sys.exit($arg)"; echo $?; done
2
0
0
因此,多处理显然尊重sys.exit
(因为sys.exit(2)
起作用),但是在sys.exit()
和sys.exit(None)
上的表现却有所不同。
我可以通过包装目标函数来轻松解决此问题,例如
try:
target()
except SystemExit as e:
if not e.args:
e.args = (0,)
e.code = 0
raise
但是这种行为差异的原因是什么(和理由,如果适用)?
从技术上讲,我看到here导致此问题的行是从多处理程序最初引入标准库中得出的。我认为该行为是错误的,但在创建问题之前想了解为什么会这样。
答案 0 :(得分:0)
有问题的代码来自原始的processing模块,该模块已作为PEP 371的一部分集成到Python 2.6 / 3.0中。原始存储库似乎不合时宜,因此问题的“为什么”部分可能无法回答。
鉴于multiprocessing
与Python行为不同(例如here)存在类似问题,它很可能被视为错误,因此我将其归档为bpo-35727。