加入并发Python输出

2024-09-28 19:08:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我用的是这样的东西:

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

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

^{pr2}$

相反,有时这些线会变得混乱:

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

我如何预防/纠正这种情况?在


Tags: 文件pysizefolderfindfilenameloggerfile1
3条回答

复杂且技术上正确的解决方案是实现一个用于编写的互斥体,但我认为这是次优的。在

反正也不好玩。如何将xargs的输出管道化(这样可以得到可靠的输出块,而不是被分解的输出流),然后以某种方式组合这些块呢?在

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

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

第二个问题是底层的写入并不总是原子的。特别是,对管道的写操作在特定大小(PIPE_BUF,通常是512字节)以内是原子的;超过这个值就不能保证了。这只严格适用于管道(而不是文件),但同样的一般问题也适用:较小的写入更可能以原子方式发生。见http://www.opengroup.org/onlinepubs/000095399/functions/write.html。在

问题是xargs的输出混合在一起。GNU并行就是为了解决这个问题而设计的。默认情况下,它保证输出不会混合在一起。所以你可以简单地这样做:

find folder/ | parallel ./logger.py > collab

这将运行一个logger.py每个CPU。如果你想要10:

^{pr2}$

观看介绍视频了解更多关于GNU并行http://www.youtube.com/watch?v=OpaiGYxkSuQ

相关问题 更多 >