为什么使用xargs maxprocs对输出无缓冲的python进程进行置乱?

2024-05-16 01:34:40 发布

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

我正在执行多个python进程,如下所示:

find /path/to/logfiles/*.gz | xargs -n1 -P4 python logparser.py

输出偶尔被置乱。在

输出流是无缓冲的,并且写入的大小更小 比默认系统(osx 10.8.2,Python2.7.2)定义的512字节的PIPE_BUF要多,所以我认为写操作应该是原子的,但是输出偶尔会被置乱。我一定是遗漏了一些东西,如有任何建议,我将不胜感激。在

谢谢。在

脚本的简化框架是:

^{pr2}$

Tags: topathpy字节定义进程系统find
1条回答
网友
1楼 · 发布于 2024-05-16 01:34:40

您可能需要考虑使用GNU Parallel。默认情况下,输出将被缓冲,直到实例完成运行:

When running jobs that output data, you often do not want the output of multiple jobs to run together. GNU parallel defaults to grouping the output of each job, so the output is printed when the job finishes. If you want the output to be printed while the job is running you can use -u.

我相信运行脚本的最佳方法是vai:

find /path/to/logfiles/*.gz | parallel python logparser.py

或者

^{pr2}$

可以使用-j标志指定要运行的进程数,即-j4。在

Parallel的好处是它支持输入参数的笛卡尔积。例如,如果要为每个文件迭代一些附加参数,可以使用:

parallel python logparser.py ::: /path/to/logfiles/*.gz ::: 1 2 3

这将导致跨多个进程运行以下操作:

python logparser.py /path/to/logfiles/A.gz 1
python logparser.py /path/to/logfiles/A.gz 2
python logparser.py /path/to/logfiles/A.gz 3
python logparser.py /path/to/logfiles/B.gz 1
python logparser.py /path/to/logfiles/B.gz 2
python logparser.py /path/to/logfiles/B.gz 3
...

祝你好运!在

相关问题 更多 >