我有多个python进程(通常每个核心1个)转换大量数据,每个数据都从专用源读取,并写入每个以附加模式打开的输出文件。
这对这些程序来说是否安全?
由于性能要求严格且数据量大,我认为我不能重复打开每个进程。关闭文件。另一个选择是让每个写入一个专用的输出文件,一个进程一旦完成就将它们连接在一起。但我宁愿避免这种情况。
提前感谢任何&所有答案和建议。
答案 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}}模块,其中 采取更多预防措施(但这些预防措施可能会减慢您的速度......您需要进行基准测试),因为它针对的是“日志文件” “这通常被多个程序附加。