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"
...
如何避免这种冲突?
答案 0 :(得分:2)
我知道没有直接的方式。
一个常见的解决方法是在“生产者”和“输出者”之间分配责任。
再一个进程负责从多进程队列输出CSV并让所有“producer”进程推送到该队列。
我建议查看python's multiprocessing module,尤其是关于queues的部分。如果您在尝试时遇到困难,请在此处提出新问题,因为这可能会变得棘手。
替代方案是使用“巨锁”,这将要求每个进程等待资源的可用性(例如,使用系统互斥锁)。这将使代码更容易但可扩展性更低。
答案 1 :(得分:1)
正如布鲁斯解释的那样,唯一经过验证的解决方案是让一个流程接受“生产者”流程的输出并写入文件。可以是队列/消息传递系统,也可以只是一个普通的旧SQL数据库(从中可以很容易地输出csv文件)。
答案 2 :(得分:1)
作为第一次也是最简单的尝试,我会尝试始终刷新()输出,这将强制IO在接受下一个数据之前写入文件。