Jupyter笔记本中的Python fork进程
我正在Jupyter笔记本中运行以下代码:Jupyter笔记本中的Python fork进程,python,python-3.x,jupyter-notebook,ipython,fork,Python,Python 3.x,Jupyter Notebook,Ipython,Fork,我正在Jupyter笔记本中运行以下代码: 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) pr
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")
我几乎每次都会得到以下输出:
儿童开始
家长
完成 “孩子”怎么会在“开始”之前打印出来?几乎10次中有9次,我得到的输出如上所述。偶尔,我会发现直觉上期望的结果(“开始”先打印,然后是“家长”或“孩子”,最后是“完成”) 当我直接在控制台上运行相同的代码时,每次都会得到预期的结果: 开始
家长
儿童
完成
为什么我们会在Jupyter笔记本中看到这种奇怪的行为?如何避免这种情况呢?我知道目前没有办法避免这种情况。可能存在已启用的设置。您也可以尝试添加等待。在您打印孩子或家长等之前,希望这能有所帮助 像这样睡觉:
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是块缓冲的,而不是行缓冲的。父级“开始\n”正在输出缓冲区中等待。子“child\n”在其自己的输出缓冲区中启动,但在退出时刷新。您可以使用导入系统进行验证;打印(sys.stdout.isatty())。解决办法是经常冲洗
print("Start", flush=True)
或者如果你有很多东西要打印
print("Foo")
print("Bar")
sys.stdout.flush()
你能给我看一下你的建议吗?另外,根据我们申请延期的具体情况,这不是太武断了吗?谢谢你的回复。我希望有其他的方法来克服这个问题,因为计时器的使用非常“黑客”。(也就是说,如果没有其他人能够提供更直接的解决方案,我将求助于此)。谢谢。您的解决方案确实为我解决了订购问题!非常感谢:-)我将测试这个问题是否会被纠正到打印。这将取决于它的运行方式。我不经常使用jupyter,所以我不确定。但是如果它是通过
%run
完成的,那么它可能只是一个管道子进程,所以stdout将被块缓冲。