【问题标题】:Output synchronization输出同步
【发布时间】:2013-10-13 10:40:58
【问题描述】:

如果 Python 有一行:

print(message)

有没有办法让消息始终作为一个整体出现在标准输出中?

问题是可能有一些子进程或 C 扩展可以同时写入标准输出。

换句话说,如果我想print() 某事如何保证它最终会在标准输出中与其他输出不交错?这甚至可能吗?我知道有multiprocessing.Lock,但这需要在子进程或扩展中的每个print 周围传递相同的锁,我不确定是否可以这样做......

【问题讨论】:

    标签: python process locking stdout


    【解决方案1】:

    在用于 Python 2 的 cPython 中,GIL(全局解释器锁)通常会为您解决这个问题。

    对于子流程,您可以使用重定向的 stdout 启动它们并在方便时报告 - 大多数库 C 扩展通常只会在出现严重问题时才向 stdout 提供输出,因此不应该成为问题。

    如果这是一个问题 - 在它出现之前我不会太担心 - 为什么不将所有打印功能替换为在需要时使用 Lock 的报告功能 - 您甚至可以用这样的类替换默认打印。

    【讨论】:

    • 不,它不会:docs.python.org/3/library/…
    • 我不会启动子进程,用户库可以。此外,这不是 Python 3 特定的,请参阅:docs.python.org/2/library/…
    • 然后将 print 覆盖为带锁的 print。如果您允许 user 库并且需要确保您的输出不会被覆盖,那么在子进程中启动它们可能更安全。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    • 2012-10-20
    • 1970-01-01
    • 2012-01-15
    • 2012-03-09
    相关资源
    最近更新 更多