多进程条件/命名锁
在一个多进程的程序中,我想根据参数来锁定某些函数,比如:
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上都测试过这个方法。