如何解决Jupyter Notebook内部的Python 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)
print("Done")
每次都几乎“得到”以下输出:
儿童
开始
父母
完成
如何在“开始”之前打印“孩子”? 10次中几乎有9次,得到的输出如上所述。有时,我会发现直觉上期望的结果(首先打印“开始”,然后打印“父母”或“孩子”,然后最后以“完成”结束)。
当我直接在控制台上运行相同的代码时,每次都会得到预期的结果:
开始
父母
儿童
完成
为什么我们在Jupyter笔记本中看到这种特殊行为?以及如何避免这种情况?
解决方法
看起来stdout是块缓冲的,而不是行缓冲的。父级“ Start \ n”正在输出缓冲区中等待。子项“ Child \ n”从其自己的输出缓冲区开始,但在退出时被刷新。您可以使用import sys;print(sys.stdout.isatty())
进行验证。解决方法是经常冲洗
print("Start",flush=True)
或者如果您要打印多个内容,
print("Foo")
print("Bar")
sys.stdout.flush()
,
目前,我无法避免这种情况。也许有一个启用的设置。您也可以尝试添加等待。在打印孩子或父母等之前。希望这会有所帮助。
像这样睡觉:
import time
# Wait for 5 seconds
time.sleep(5)
# Wait for 300 milliseconds
# .3 can also be used
time.sleep(.300)
我建议等待0.5毫秒到1秒
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。