gpt4 book ai didi

python条件锁

转载 作者:行者123 更新时间:2023-12-03 13:15:09 24 4
gpt4 key购买 nike

我怎样才能在线程应用程序中实现条件锁,例如我haw
30 个线程正在调用函数,并且在大多数情况下,所有线程都可以同时访问,但根据函数输入,可能存在只有一个线程可以做一件事的情况。 (如果输入值重复并且某些线程仍在工作,那么我需要锁定。)

我现在有了 Rlock() 的模块线程,但我现在不知道如何以我在第一部分中描述的方式使用它。

编辑 :问题实际上是关于如何防止任何两个线程同时运行具有相同参数的相同函数。 (感谢大卫帮助我提出我的问题:))

最佳答案

试试这个:在你的函数所在的模块中有一个锁,如果函数的输入需要锁定,则在函数内部获取锁。否则不要。

l = threading.RLock()

def fn(arg):
if arg == arg_that_needs_lock:
l.acquire()
try:
# do stuff
finally:
l.release()
else:
# do other stuff

编辑:

据我现在所知,问题实际上是关于如何防止任何两个线程同时使用相同的参数运行相同的函数。不过,两个线程同时运行具有不同参数的同一个函数是没有问题的。如果函数的所有有效参数都可以是字典键,那么执行此操作的简单方法是创建锁参数字典:
import threading

dict_lock = threading.RLock()
locks = {}

def fn_dict(arg):
dict_lock.acquire()
try:
if arg not in dict:
locks[arg] = threading.RLock()
l = locks[arg]
finally:
dict_lock.release()
l.acquire()
try:
# do stuff
finally:
l.release()

但是,如果可以使用许多不同的参数调用您的函数,则这相当于很多锁。可能更好的方法是拥有一组函数当前正在执行的所有参数,并让该组的内容受锁保护。我认为这应该有效:
set_condition = threading.Condition()
current_args = set()

def fn_set(arg):
set_condition.acquire()
try:
while arg in current_args:
set_condition.wait()
current_args.add(arg)
finally:
set_condition.release()
# do stuff
set_condition.acquire()
try:
current_args.remove(arg)
set_condition.notifyAll()
finally:
set_condition.release()

关于python条件锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/625491/

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