multiprocessing.Process无法处理与Python相同的sys.exit参数

时间:2019-01-12 16:31:37

标签: python python-multiprocessing

我试图强迫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导致此问题的行是从多处理程序最初引入标准库中得出的。我认为该行为是错误的,但在创建问题之前想了解为什么会这样。

1 个答案:

答案 0 :(得分:0)

有问题的代码来自原始的processing模块,该模块已作为PEP 371的一部分集成到Python 2.6 / 3.0中。原始存储库似乎不合时宜,因此问题的“为什么”部分可能无法回答。

鉴于multiprocessing与Python行为不同(例如here)存在类似问题,它很可能被视为错误,因此我将其归档为bpo-35727