gpt4 book ai didi

Python:具有短生命周期键的线程安全字典,这是正确的吗?

转载 作者:太空宇宙 更新时间:2023-11-04 11:03:33 34 4
gpt4 key购买 nike

import threading
import weakref
_mainlock = threading.RLock()
_job_locks = weakref.WeakValueDictionary()
def do_thing(job_id):
_mainlock.acquire() #Dictionary modification lock acquire
_job_locks.setdefault(job_id, threading.RLock()) #Possibly modifies the dictionary
_mainlock.release()
_job_locks[job_id].acquire()
try:
one_time_init(job_id)
finally:
_job_locks[job_id].release()
#On function return, the weakref.WeakValueDictionary should cause the key to evaporate

假设 do_thing() 在 ID 编号可能相同或不同的许多线程上被多次调用(例如,4 次 ID 3,各 1 次 ID 不同),这个线程安全吗? one_time_init() 是否会一次针对特定作业 ID 运行多次? (PS:one_time_init 保存的是每个 ID 都运行过一次的状态,所以如果已经运行完成就调用它是空操作)


更新代码(感谢 THC4k):

import threading
import weakref
_mainlock = threading.RLock()
_job_locks = weakref.WeakValueDictionary()

def do_thing(job_id):
with _mainlock:
jl = _job_locks.setdefault(job_id, threading.RLock())
with jl:
one_time_init(job_id)

最佳答案

似乎非常安全。为什么你甚至需要 _job_locks 如果 one_time_init 再次检查它是否运行?你可以在那里加锁。为什么是RLock而不是Lock(函数似乎永远不会重入)?

无论如何,with 语句看起来更好:

import threading
import weakref
_mainlock = threading.RLock()
_job_locks = weakref.WeakValueDictionary()

def do_thing(job_id):
with _mainlock:
_job_locks.setdefault(job_id, threading.RLock())
with _job_locks[job_id]:
one_time_init(job_id)

关于Python:具有短生命周期键的线程安全字典,这是正确的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3319392/

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