lock

lock(self, lock_name, timeout=-1)

使用范围: server

编程语言: python

父类: Task 类

描述说明

使用 lock 在 Python 中实现独立于平台的文件锁,这提供了一种简单的进程间通信方式。

此方法对 Python 文件锁库的重新封装: https://github.com/benediktschmitt/py-filelock

一旦获取了锁,后续获取它的尝试就会被阻止执行,直到它被释放。

lock_name 参数是 “锁(lock)” 的名称,在应用程序内它必须是唯一的。 filelock 库在 locks 文件夹中创建一个具有此名称和 .lock 扩展名的文件, 用于实现 “锁(lock)”。

timeout 参数 - 如果在超时秒内无法获取锁,则会引发 Timeout 异常。

示例

def calculate(item):
    lock = item.task.lock('calculation'):
    lock.acquire()
    try:
        #some code
    finally:
        lock.release()

上面的代码与下面的效果一样:

def calculate(item):
    with item.task.lock('calculation'):
        #some code

带有 timeout 的示例:

from jam.third_party.filelock import Timeout

def calculate(item):
  try
    with item.task.lock('calculation', timeout=10):
        #some code
  except Timeout:
    print("Another instance of this application currently holds the lock.")

在以下示例中,保存发票时,应用程序会计算已售出的曲目。 在执行此操作之前,它会获取一个锁:

def on_apply(item, delta, params):
    with item.task.lock('invoice_saved'):
        tracks_sql = []
        delta.update_deleted()
        for d in delta:
            for t in d.invoice_table:
                if t.rec_inserted():
                    sql = "UPDATE DEMO_TRACKS SET TRACKS_SOLD = COALESCE(TRACKS_SOLD, 0) + \
                    %s WHERE ID = %s" % \
                    (t.quantity.value, t.track.value)
                elif t.rec_deleted():
                    sql = "UPDATE DEMO_TRACKS SET TRACKS_SOLD = COALESCE(TRACKS_SOLD, 0) - \
                    (SELECT QUANTITY FROM DEMO_INVOICE_TABLE WHERE ID=%s) WHERE ID = %s" % \
                    (t.id.value, t.track.value)
                elif t.rec_modified():
                    sql = "UPDATE DEMO_TRACKS SET TRACKS_SOLD = COALESCE(TRACKS_SOLD, 0) - \
                    (SELECT QUANTITY FROM DEMO_INVOICE_TABLE WHERE ID=%s) + %s WHERE ID = %s" % \
                    (t.id.value, t.quantity.value, t.track.value)
                tracks_sql.append(sql)
        sql = delta.apply_sql()
        return item.task.execute(tracks_sql + [sql])