如何让多个Python程序向同一文件添加行?
我有多个Python进程(通常每个核心一个)在处理大量数据,它们各自从专用的数据源读取数据,然后写入一个输出文件,这个文件是以追加模式打开的。
这样做安全吗?
因为对性能的要求很高,而且数据量也很大,我觉得每个进程反复打开和关闭文件是不现实的。另一种选择是让每个进程写入一个专用的输出文件,然后再由一个单独的进程把这些文件合并在一起。但我更希望能避免这样做。
提前感谢所有的回答和建议。
2 个回答
你的操作是“安全的”,也就是说不会导致程序崩溃,但如果不同的进程在非常不巧的时机同时写数据,就有可能出现混乱。例如,进程1在写一长串的a
,而进程2在写一长串的b
,结果你可能会在文件里看到很多a
,然后是b
,再然后又是a
(或者其他的组合/混合)。
问题在于,.write
方法对于很长的字符串参数并不能保证是原子操作。也就是说,如果你的字符串长度小于文件系统或操作系统的块大小,可能会比较幸运,不会出现混乱。否则,你可以尝试使用logging
模块,它会采取更多的预防措施(不过这些措施可能会让你运行得慢一些……你需要进行性能测试),正是因为它是专门用来处理“日志文件”的,这些文件通常会被多个程序同时写入。
你有没有想过使用 multiprocessing 模块来让正在运行的程序像线程一样进行协调呢?特别是可以看看队列接口;当每个工作项完成时,你可以把它放到一个队列里,然后有一个单独的进程从这个队列中读取数据,并写入你的输出文件。
另外,你也可以让每个子进程和一个父进程保持一个单独的管道,父进程可以从所有子进程中进行选择(select()),并在合适的时候把数据复制到输出文件里。当然,这个过程可以“手动”完成(不使用multiprocessing模块)也可以使用它。
还有,如果你避免使用线程是为了躲避全局解释器锁(global interpreter lock),你可以考虑使用非CPython的实现,比如Jython或IronPython。