多进程条件/命名锁

1 投票
2 回答
4167 浏览
提问于 2025-04-16 03:54

在一个多进程的程序中,我想根据参数来锁定某些函数,比如:

def calculate(spreadsheet):
    _do_calc(spreadsheet)

我现在想做的是,基于电子表格来锁定这个函数,这样多个电子表格可以同时处理,但如果对同一个电子表格进行两次调用,就会锁定,比如:

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

使用multiprocessing.Lock可以实现吗?如果不行,还有什么其他方法?我在考虑使用基于fcntl的文件锁。

编辑:上面是我问题的一个非常简化的版本,实际上我并没有使用multiprocessing模块,我有N个不同的脚本,它们处理一些数据,有时会处理相同的数据,我想避免这种情况,所以我想在某些时刻让它们同步,比如它们都可以导入一个模块mylock,并使用mylock.lock来进行同步。

import mylock

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

我可以用哪些不同的方法来写mylock.lock?目前我只是创建一个名为spreadsheet.id的文件,并在锁释放时删除它。

2 个回答

2

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

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

    ...

然后

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

你可以通过这个方法来改进简单的文件打开方式,我在Linux和Windows上都测试过这个方法。

撰写回答