使用顾问文件锁限制并发进程

时间:2016-09-28 04:59:42

标签: linux file unix concurrency locking

执行代码片段X时,不应执行片段Y,执行Y时不应执行X.如果当前执行了另一个,则应暂停X和Y.

但是,允许任意数量的进程或线程同时执行代码X.

并行执行多个Y怎么样?它应该暂停,直到执行Y的另一个实例或死亡,并且出现错误“不能并行执行多个Y”。

这可以用Unix顾问文件锁实现吗?我想我应该将当前执行的X的数量写入文件(类似于引用计数)。或者我可能需要两个文件:一个用于存储执行X的并发进程数,另一个用于锁定第一个进程?现在让我们尝试构建算法。

请注意,我是用Python编写的。

1 个答案:

答案 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的函数中。