這可以用一個鎖來解決,因爲有兩種諮詢文件鎖:獨佔和共享。 Y獲得排他鎖和X共享鎖。
下面是實際的代碼:
class SequentialTask:
def __init__(self, lock_file):
self.lock_file = lock_file
def sequential(self, lock_mode):
def sequential_decorator(func):
#@wraps(func) # TODO: doesn't work
def func_wrapper(*args, **kwargs):
with open(self.lock_file, 'w') as file:
logger = logging.getLogger(__name__)
logger.debug("Locking a sequential request...")
flock(file, lock_mode)
try:
return func(*args, **kwargs)
finally:
logger.debug("Unlocking a sequential request...")
# unlink(self.lock_file) # Don't do: http://stackoverflow.com/q/17708885/856090
flock(file, LOCK_UN)
# unlink(self.lock_file) # Don't do: open but unlocked file may be deleted.
return func_wrapper
return sequential_decorator
然後
task = SequentialTask(VAR_DIR+"/groups-modify.lock")
,只是添加@task.sequential(LOCK_SH)
到功能實現X和@task.sequential(LOCK_EX)
到
注意,X在實施Y的功能我真正的問題是修改數據庫的代碼,Y是數據庫恢復過程,如果數據在某種程度上不一致,則需要使用 – porton
如果存在Y請求掛起是否允許X請求繼續進行,還是一直持續到Y被處理?是否還有其他共享/飢餓問題需要擔心(例如,阻止X請求的Y請求太多)?這幾乎是標準的'讀者和作者'相互排斥或鎖定的東西 - 基本併發理論。只要流程合作,就可以通過諮詢鎖定來完成。 –
@JonathanLeffler你是什麼意思的「待定」?如果Y被執行,所有X必須等待。我需要一個或兩個諮詢鎖嗎? – porton