【问题标题】:No print output from child multiprocessing.Process unless the program crashes子 multiprocessing.Process 没有打印输出,除非程序崩溃
【发布时间】:2010-09-26 21:26:18
【问题描述】:

我在使用 Python 多处理模块时遇到问题。我正在使用Process 类来生成一个新进程,以便利用我的第二个核心。第二个过程将一堆数据加载到 RAM 中,然后耐心等待而不是消耗。

我想看看那个进程用print 命令打印了什么,但是,我没有看到它打印的任何东西。我只看到父进程打印的内容。现在这对我来说很有意义,因为他们生活在两个不同的过程中。第二个进程不会产生自己的 shell/标准输出窗口,也不会将其输出发送到父进程。然而,当这个进程崩溃时,它会打印我的脚本告诉它打印的所有内容,以及堆栈跟踪和错误。

我想知道是否有一种简单的方法可以将子进程的打印输出发送到第一个进程,或者让它产生一个 shell/标准输出以便我可以调试它。我知道我可以创建一个 multiprocessing.Queue 专门用于将打印传输到父级,以便它可以将这些打印到标准输出,但如果存在更简单的解决方案,我不想这样做。

【问题讨论】:

    标签: python multithreading io multiprocessing


    【解决方案1】:

    您是否尝试过刷新标准输出?

    import sys
    print "foo"
    sys.stdout.flush()
    

    【讨论】:

    • 太棒了!是的,这确实有效。这个 sys.stdout.flush() 有什么作用?它是否明确强制打印到标准输出?再次感谢!
    • 它清除缓冲区。保存标准输出,直到您有一个完整的缓冲区。冲洗停止等待。尝试打印到 stderr 以查看它的作用。有时它是无缓冲的。
    • @Nicholas:没问题 :) 当运行子进程时,它们的标准输出通常会被缓冲(而它们的标准错误通常不会),S.Lott 解释了这意味着什么。您可以尝试不同的技巧来防止缓冲,但记住使用 sys.stdout.flush() 很简单并且总是有效的。
    • 这仍然是一个可接受的解决方案吗?它对我不起作用。
    • @fraxture 如果标准输出被缓冲,这会有所帮助。也许您想针对您的具体案例提出问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    相关资源
    最近更新 更多