如何让多个python程序将行追加到同一个文件中?

时间:2010-03-07 19:22:58

标签: python concurrency

我有多个python进程(通常每个核心1个)转换大量数据,每个数据都从专用源读取,并写入每个以附加模式打开的输出文件。

这对这些程序来说是否安全?

由于性能要求严格且数据量大,我认为我不能重复打开每个进程。关闭文件。另一个选择是让每个写入一个专用的输出文件,一个进程一旦完成就将它们连接在一起。但我宁愿避免这种情况。

提前感谢任何&所有答案和建议。

2 个答案:

答案 0 :(得分:4)

您是否考虑过使用multiprocessing模块以类似线程的方式在正在运行的程序之间进行协调?特别参见队列接口;您可以在完成后将每个已完成的工作项放在队列中,并让一个进程读取队列并写入输出文件。

或者,您可以让每个子进程维护一个单独的管道到父进程,该进程从所有进程执行select()调用,并在适当时将数据复制到输出文件。当然,这可以“手动”(没有多处理模块)以及它来完成。

或者,如果您避免线程的原因是为了避免全局解释器锁定,您可能会考虑使用非CPython实现(例如Jython或IronPython)。

答案 1 :(得分:4)

您的程序是“安全的”,因为不会导致崩溃,但来自不同进程的数据(非常不合时宜)可能混淆 - 例如,进程1附加一个长字符串a的{​​{1}},第2个b长字符串, 最终会在a s b s的文件中结束a然后更多.write s(或其他组合/混合)。

问题是,对于足够长的字符串参数,logging不能保证是原子的。如果你在参数上有一个紧密的边界,比你的fs / os的块大,你可能会很幸运。否则,请尝试使用{{1}}模块,其中 采取更多预防措施(但这些预防措施可能会减慢您的速度......您需要进行基准测试),因为它针对的是“日志文件” “这通常被多个程序附加。