【发布时间】:2012-11-06 22:34:37
【问题描述】:
我正在尝试解决一个涉及大量子问题的大数值问题,并且我正在使用 Python 的多处理模块(特别是 Pool.map)将不同的独立子问题拆分到不同的核心上。每个子问题都涉及计算大量子子问题,如果尚未由任何进程计算,我试图通过将它们存储到文件中来有效地记忆这些结果,否则跳过计算并从文件中读取结果。
我遇到了文件的并发问题:不同的进程有时会检查是否已经计算了子子问题(通过查找将存储结果的文件),看到它没有,运行计算,然后尝试将结果同时写入同一个文件。如何避免写这样的冲突?
【问题讨论】:
-
查看文档中使用
multiprocessing.Lock同步多个进程的示例。 -
您可以只有一个进程写入结果,队列作为输入,可以由其他工作进程提供。我相信让所有工作进程只读是安全的。
-
我应该提到,为了让事情变得更复杂,我在一个集群上同时运行多个不同的主要问题,每个问题都将结果写入同一个网络上的子子问题文件系统。因此,我可以从完全在不同机器上运行的进程中获得冲突(所以我认为使用 multiprocessing.Lock 之类的解决方案不会起作用)。
-
如果您的网络文件系统支持文件锁定,您可以使用操作系统特定的文件创建方法来独占创建文件并对其保持独占锁定,直到结果准备好,然后关闭它。任何未能“赢得”创建竞赛的进程都会尝试打开它并重试(有延迟),直到能够打开它,然后他们才能读取结果。
-
您实际上是在对数据库服务器进行编程。您是否考虑过使用现有的?
标签: python io multiprocessing mutex