我用的是这样的东西:
find folder/ | xargs -n1 -P10 ./logger.py > collab
在logger.py
内,我正在处理输出重新格式化的行的文件。所以collab应该看起来像
相反,有时这些线会变得混乱:
{'filename' : 'file1', 'size' : 1000}
{'file
{'filename' : 'file1', 'size' : 1000}
name' : 'file1', 'size' : 1000}
{'filename' : 'file1', 'size' : 1000}
我如何预防/纠正这种情况?在
复杂且技术上正确的解决方案是实现一个用于编写的互斥体,但我认为这是次优的。在
反正也不好玩。如何将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并行就是为了解决这个问题而设计的。默认情况下,它保证输出不会混合在一起。所以你可以简单地这样做:
这将运行一个logger.py每个CPU。如果你想要10:
^{pr2}$观看介绍视频了解更多关于GNU并行http://www.youtube.com/watch?v=OpaiGYxkSuQ
相关问题 更多 >
编程相关推荐