gpt4 book ai didi

python - 基于值的线程锁

转载 作者:太空狗 更新时间:2023-10-30 02:42:07 26 4
gpt4 key购买 nike

如果之前有人问过这个问题,请原谅我。我环顾四周,但我觉得我没有合适的词汇来通过网络搜索找到它。

我在 python 中有一个多线程应用程序。我希望能够锁定某个代码块,但仅限于具有特定条件的其他线程。我举个例子:有3个线程,thread_athread_bthread_c。每个线程都可以随时运行函数 foo。我不希望任何两个 bar 彼此相等的线程能够同时访问 Code block ALPHA。但是,我不想阻止 bar 值不同的线程。在这种情况下,假设 thread_a 有一个 bar == "cat" 并且首先命中行 (3)。在 thread_a 命中 (5) 行之前,让我们说 thread_bbar == "cat" 命中行 (3)。我想让 thread_b 等待。但是,如果 thread_cbar == "dog" 一起出现,我希望它能够继续运行。

(1) def foo(bar):
(2)
(3) lock(bar)
(4) # Code block ALPHA (two threads with equivalent bar should not be in here)
(5) unlock(bar)

另外请注意,bar 的可能值是完全不可预测的,但发生冲突的可能性非常高。

感谢您的帮助。我正在查看的图书馆是 python threading library

最佳答案

已更新

好消息:我能够通过我拼凑的有点粗糙的测试平台使用我的原始答案重现您遇到的 release_lock 问题,并使用计数机制解决问题(如您所建议的)-至少就我的测试设备而言是这样。

现在使用两个单独的共享字典,一个像以前一样跟踪与每个锁关联的“名称”或值,另一个跟踪在给定时间有多少线程正在使用每个锁。

和以前一样,锁名称必须是可散列的值,以便它们可以用作字典中的键。

import threading

namespace_lock = threading.Lock()
namespace = {}
counters = {}

def aquire_lock(value):
with namespace_lock:
if value in namespace:
counters[value] += 1
else:
namespace[value] = threading.Lock()
counters[value] = 1

namespace[value].acquire()

def release_lock(value):
with namespace_lock:
if counters[value] == 1:
del counters[value]
lock = namespace.pop(value)
else:
counters[value] -= 1
lock = namespace[value]

lock.release()

# sample usage
def foo(bar):
aquire_lock(bar)
# Code block ALPHA (two threads with equivalent bar should not be in here)
release_lock(bar)

关于python - 基于值的线程锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37624289/

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