执行代码片段X时,不应执行片段Y,执行Y时不应执行X.如果当前执行了另一个,则应暂停X和Y.
但是,允许任意数量的进程或线程同时执行代码X.
并行执行多个Y怎么样?它应该暂停,直到执行Y的另一个实例或死亡,并且出现错误“不能并行执行多个Y”。
这可以用Unix顾问文件锁实现吗?我想我应该将当前执行的X的数量写入文件(类似于引用计数)。或者我可能需要两个文件:一个用于存储执行X的并发进程数,另一个用于锁定第一个进程?现在让我们尝试构建算法。
请注意,我是用Python编写的。
答案 0 :(得分:0)
这可以通过一个锁来解决,因为有两种咨询文件锁:独占和共享。 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)
添加到实现Y的函数中。