gpt4 book ai didi

linux - 使用建议文件锁限制并发进程

转载 作者:太空宇宙 更新时间:2023-11-04 12:42:28 25 4
gpt4 key购买 nike

当代码片段 X 被执行时,片段 Y 不应被执行,当 Y 被执行时,X 不应被执行。相反,如果当前正在执行另一个 X 和 Y,则应将其暂停。

然而,允许任意数量的进程或线程并发执行代码 X。

并行执行多个 Y 怎么样?它也应该暂停,直到 Y 的另一个实例被执行或死于错误“无法并行执行多个 Y”。

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

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

最佳答案

这可以用一个锁来解决,因为有两种建议文件锁:独占和共享。 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 的函数。

关于linux - 使用建议文件锁限制并发进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39738386/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com