Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jupyter笔记本中的Python fork进程_Python_Python 3.x_Jupyter Notebook_Ipython_Fork - Fatal编程技术网

Jupyter笔记本中的Python fork进程

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

我正在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笔记本中看到这种奇怪的行为?如何避免这种情况呢?

我知道目前没有办法避免这种情况。可能存在已启用的设置。您也可以尝试添加等待。在您打印孩子或家长等之前,希望这能有所帮助

像这样睡觉:

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将被块缓冲。