【问题标题】:Multiprocess conditional/named Lock多进程条件/命名锁
【发布时间】:2011-04-10 06:09:01
【问题描述】:

在多进程程序中,我想根据参数锁定某些函数,例如

def calculate(spreadsheet):
    _do_calc(spreadsheet)

现在我要做的是基于电子表格,锁定功能,以便可以同时处理多个电子表格,但同一电子表格上的两个调用将锁定例如

def calculate(spreadsheet):
    with Lock(spreadsheet.id):
      _do_calc(spreadsheet)

是否可以使用 multiprocessing.Lock ,如果不是,还有什么替代方案?我正在考虑使用基于 fcntl 的文件锁定。

编辑: 上面是我的问题的一个非常简化的版本,基本上我没有使用多处理模块,我有 N 个不同的脚本可以处理一些数据,有时我想避免相同的数据,所以想在某些时候同步它们,例如他们都可以导入一个模块 mylock 并使用 mylock.lock 来同步

import mylock

def calculate(spreadsheet):
    with mylock.lock(spreadsheet.id):
      _do_calc(spreadsheet)

我可以通过哪些方式编写 mylock.lock,目前我只是创建一个名为 spreadsheet.id 的文件,并在锁定释放时将其删除。

【问题讨论】:

  • 使用ilock,您可以使用命名系统范围的锁

标签: python locking mutex


【解决方案1】:

您也许可以使用this recipe 改进简单的文件打开方式,我已经在 Linux 和 Windows 上进行了测试。

【讨论】:

  • 我其实在用 fcntl.lockf 效果很好,但是想看看有没有更好的解决方案
【解决方案2】:

为什么不给每个电子表格一个Lock 作为实例属性?

class Spreadsheet(...):
    def __init__(self, ...):
        self.lock = multiprocessing.Lock()

    ...

然后

def calculate(spreadsheet):
    with spreadsheet.lock:
        ...

【讨论】:

  • 在某些情况下,实例是在进程分支之后创建的 - 但它仍然有一些属性可以识别为同一个,例如路径或一些名称。
猜你喜欢
  • 1970-01-01
  • 2015-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-03
  • 2018-10-06
  • 2011-12-09
  • 2019-11-22
相关资源
最近更新 更多