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])