Python Jupyter Notebook 中的 fork 进程

Python fork process inside Jupyter Notebook

我正在 运行在 Jupyter notebook 中使用以下代码:

import os

print("Start")
pid = os.fork()

if pid == 0:
    print("Child")
    os._exit(os.EX_OK)
else:
    print("Parent")
    
if pid != 0:
    # parent
    pid, status = os.waitpid(pid, 0)
    print("Done")

我每次都“几乎”得到以下输出:

Child
Start
Parent
Done

为什么在“Start”之前打印“Child”?几乎 10 次中有 9 次,我得到的输出如上。偶尔,我会发现直觉所期望的(首先打印“Start”,然后是“Parent”或“Child”,最后以“Done”结束)。

当我直接在控制台上 运行 相同的代码时,我每次都得到预期的结果:

Start
Parent
Child
Done

为什么我们会在 Jupyter 笔记本中看到这种奇怪的行为?以及如何避免这种情况?

据我所知,目前没有办法避免这种情况。也许有一个启用的设置。您也可以尝试添加等待时间。在打印 child 或 parent 等之前。希望这对您有所帮助。

这样睡:

import time
 
# Wait for 5 seconds
time.sleep(5)
 
# Wait for 300 milliseconds
# .3 can also be used
time.sleep(.300)

我建议等待 0.5 毫秒到 1 秒

看起来 stdout 是块缓冲的,而不是行缓冲的。父级“Start\n”正在输出缓冲区中等待。子“Child\n”在它自己的输出缓冲区中开始,但在退出时被刷新。您可以使用 import sys;print(sys.stdout.isatty()) 进行验证。解决办法就是经常冲洗

print("Start", flush=True)

或者如果您有多个要打印的东西,

print("Foo")
print("Bar")
sys.stdout.flush()