如何让多个Python程序向同一文件添加行?

4 投票
2 回答
2870 浏览
提问于 2025-04-15 20:07

我有多个Python进程(通常每个核心一个)在处理大量数据,它们各自从专用的数据源读取数据,然后写入一个输出文件,这个文件是以追加模式打开的。

这样做安全吗?

因为对性能的要求很高,而且数据量也很大,我觉得每个进程反复打开和关闭文件是不现实的。另一种选择是让每个进程写入一个专用的输出文件,然后再由一个单独的进程把这些文件合并在一起。但我更希望能避免这样做。

提前感谢所有的回答和建议。

2 个回答

4

你的操作是“安全的”,也就是说不会导致程序崩溃,但如果不同的进程在非常不巧的时机同时写数据,就有可能出现混乱。例如,进程1在写一长串的a,而进程2在写一长串的b,结果你可能会在文件里看到很多a,然后是b,再然后又是a(或者其他的组合/混合)。

问题在于,.write方法对于很长的字符串参数并不能保证是原子操作。也就是说,如果你的字符串长度小于文件系统或操作系统的块大小,可能会比较幸运,不会出现混乱。否则,你可以尝试使用logging模块,它会采取更多的预防措施(不过这些措施可能会让你运行得慢一些……你需要进行性能测试),正是因为它是专门用来处理“日志文件”的,这些文件通常会被多个程序同时写入。

4

你有没有想过使用 multiprocessing 模块来让正在运行的程序像线程一样进行协调呢?特别是可以看看队列接口;当每个工作项完成时,你可以把它放到一个队列里,然后有一个单独的进程从这个队列中读取数据,并写入你的输出文件。

另外,你也可以让每个子进程和一个父进程保持一个单独的管道,父进程可以从所有子进程中进行选择(select()),并在合适的时候把数据复制到输出文件里。当然,这个过程可以“手动”完成(不使用multiprocessing模块)也可以使用它。

还有,如果你避免使用线程是为了躲避全局解释器锁(global interpreter lock),你可以考虑使用非CPython的实现,比如Jython或IronPython。

撰写回答