【问题标题】:Why is a Python multiprocessing daemon process not printing to standard output?为什么 Python 多处理守护进程不打印到标准输出?
【发布时间】:2014-12-31 11:10:13
【问题描述】:

我一直在尝试多处理,但遇到了守护进程。

我有一个守护进程和一个非守护进程,守护进程无限期地每隔一秒发出一次输出,而非守护进程在启动时立即打印输出,休眠 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...

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

【问题讨论】:

    标签: python multiprocessing


    【解决方案1】:

    您可以通过放置打开日志来更清晰地了解事件的顺序

    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
    

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

    【讨论】:

    • 啊,我明白了,守护进程在主进程结束时终止,而不是在所有非守护进程子进程完成时终止。有道理,非常感谢!我猜想在主进程的末尾添加一个 p.join() 会使其等待非守护进程完成。
    猜你喜欢
    • 1970-01-01
    • 2013-09-01
    • 2023-03-10
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    • 1970-01-01
    相关资源
    最近更新 更多