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()
我正在 运行在 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()