多个进程写一个相同的CSV文件,如何避免冲突?

时间:2013-11-07 08:12:24

标签: python csv parallel-processing

9个进程在我们的系统中同时写入相同的CSV输出。输出速度很快。每天大约有1000万个新行。 要编写CSV文件,我们使用Python2.7的csv模块。

最近我注意到CSV文件中有一些混合行(参见下面的例子)。

e.g。

"name", "sex", "country", "email"
...# skip some lines
"qi", "Male", "China", "redice
...# skip some lines
"Jamp", "Male", "China", "jamp@site-digger.com"
...# skip some lines
@163.com"

正确的输出应该是:

"name", "sex", "country", "email"
...# skip some lines
"qi", "Male", "China", "redice@163.com"
...# skip some lines
"Jamp", "Male", "China", "jamp@site-digger.com"
...

如何避免这种冲突?

3 个答案:

答案 0 :(得分:2)

我知道没有直接的方式。

一个常见的解决方法是在“生产者”和“输出者”之间分配责任。

再一个进程负责从多进程队列输出CSV并让所有“producer”进程推送到该队列。

我建议查看python's multiprocessing module,尤其是关于queues的部分。如果您在尝试时遇到困难,请在此处提出新问题,因为这可能会变得棘手。

替代方案是使用“巨锁”,这将要求每个进程等待资源的可用性(例如,使用系统互斥锁)。这将使代码更容易但可扩展性更低。

答案 1 :(得分:1)

正如布鲁斯解释的那样,唯一经过验证的解决方案是让一个流程接受“生产者”流程的输出并写入文件。可以是队列/消息传递系统,也可以只是一个普通的旧SQL数据库(从中可以很容易地输出csv文件)。

答案 2 :(得分:1)

作为第一次也是最简单的尝试,我会尝试始终刷新()输出,这将强制IO在接受下一个数据之前写入文件。