gpt4 book ai didi

python - 加入并发 Python 输出

转载 作者:太空狗 更新时间:2023-10-29 21:07:47 25 4
gpt4 key购买 nike

我正在使用这样的东西:

find folder/ | xargs -n1 -P10 ./logger.py > collab

logger.py 中,我正在处理输出重新格式化行的文件。所以协作应该看起来像

{'filename' : 'file1', 'size' : 1000}
{'filename' : 'file1', 'size' : 1000}
{'filename' : 'file1', 'size' : 1000}
{'filename' : 'file1', 'size' : 1000}

有时行会变得困惑:

{'filename' : 'file1', 'size' : 1000}
{'file
{'filename' : 'file1', 'size' : 1000}
name' : 'file1', 'size' : 1000}
{'filename' : 'file1', 'size' : 1000}

如何防止/纠正此问题?

最佳答案

一般来说,如果不深入研究多进程锁定,就很难保证这不会发生。但是,您通常可以大大减少问题。

最常见的原因是 Python 或 libc 中的 I/O 缓冲。例如,它可能缓冲 16k 的输出,然后一次写入整个 block 。您可以通过在写入后刷新 stdout 来减少它,但这很尴尬。理论上,您应该能够将 -u 传递给 Python 以禁用 stdout 缓冲,但是当我尝试时它不起作用。请参阅 Sebastjan 对 Disable output buffering 的回答更通用的解决方案(尽管可能有一种方法可以更直接地禁用输出缓冲)。

第二个问题是底层写入并不总是原子的。特别是,对管道的写入只有达到一定大小(PIPE_BUF,通常为 512 字节)时才是原子的;以上是不能保证的。这仅严格适用于管道(不适用于文件),但同样存在一般性问题:较小的写入更有可能以原子方式发生。参见 http://www.opengroup.org/onlinepubs/000095399/functions/write.html .

关于python - 加入并发 Python 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5022071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com