python - 为什么 Python 多处理守护进程不打印到标准输出?

标签 python multiprocessing

我一直在试验多处理,并遇到守护进程的思维障碍。

我有一个守护进程和一个非守护进程,守护进程无限期地每隔一秒发出一次输出,而非守护进程在启动时立即打印输出,休眠 3 秒,然后再次打印并返回。

问题是,守护进程的预期输出根本没有出现。

回顾过去关于守护进程的 SO 问题,常见问题似乎是其他进程在守护进程之前结束,或者标准输出需要刷新以显示输出。两者(我认为)都已得到解决,但我仍然只看到来自非守护进程的打印输出。

代码:

from multiprocessing import Process, current_process
import sys
import time

def worker():
    """
    Announce that the process has started, sleep 3 seconds
    then announce that the process is ending.
    """
    name = current_process().name
    print name, 'starting...'
    sys.stdout.flush()

    time.sleep(3)
    print name, 'ending...'
    sys.stdout.flush()

    return


def daemon():
    """
    Announce that the process has started, beep, then beep
    once every second
    """
    name = current_process().name
    print name, 'starting...'
    print 'beep...'
    sys.stdout.flush()

    while True:
        time.sleep(1)
        print 'beep...'
        sys.stdout.flush()


if __name__=='__main__':
    d = Process(target=daemon)
    d.daemon = True
    d.start()

    p = Process(target=worker)
    p.daemon = False
    p.start()

预期输出:

Process-1 starting... # Order here may vary
beep...
Process-2 starting...
beep...
beep...
Process-2 ending... #There may or may not be another beep here

实际产生了什么:

Process-2 starting...
Process-2 ending...

任何关于为什么会发生这种情况的建议将不胜感激。

最佳答案

您可以通过放置

打开日志记录来更清楚地了解事件的顺序
import multiprocessing as mp
logger = mp.log_to_stderr(logging.INFO)

在其他导入语句之后。然后你的程序会产生类似的东西:

[INFO/Process-1] child process calling self.run()
[INFO/MainProcess] process shutting down
Process-1 starting...
beep...
[INFO/Process-2] child process calling self.run()
[INFO/MainProcess] calling terminate() for daemon Process-1
Process-2 starting...
[INFO/MainProcess] calling join() for process Process-2
Process-2 ending...
[INFO/Process-2] process shutting down
[INFO/Process-2] process exiting with exitcode 0
[INFO/MainProcess] calling join() for process Process-1

因此,main 首先开始关闭,然后终止守护进程 Process-1。这就是为什么在 Process-2 继续时您不会再看到任何哔哔声的原因。

关于python - 为什么 Python 多处理守护进程不打印到标准输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27720281/

相关文章:

python - 多处理与 NumPy 不兼容

python - 什么时候可以 pickle Python 对象

python - 如何在 python 2.7 中使用 pymongo 进行多处理池

python - 如何修复输出文件不逐行破坏输出?

python - 在 PuLP 中使用线性规划优化排类

python - 是否有适当的方法来子类化 Tensorflow 的数据集?

python - 使用 pandas `get_dummies` 与 `drop_first=True` 时如何对齐训练和测试集?

java - 针对大量小数据的 IPC 建议

python - 使用 Keras 使用多个指标进行预测

python - 如何与目标列表并行复制文件列表? Python