我如何能实现在多线程应用程序的条件锁,例如我山楂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()