【发布时间】:2021-07-31 06:30:05
【问题描述】:
我有如下要求:
global_storage = "some_global_storage_system"
def call_me():
global_storage += 1
if global_storage > 1000:
with threading.Lock():
global_storage = 0 # reset global storage
# performing some action
以上代码可以同时被5个线程访问
我找到了很多这样做的方法,但没有将它们收集在一个地方,并且没有提到以下哪一种是在上述程序中实现 global_storage 之类的最佳和最安全的方法:
- 使用 python
queues库(因为它是线程安全的,但可能是内存问题):每次将一个项目放入队列中,并检查队列长度何时变为 1000,然后再次将队列长度设为 0。 - 在全局级别使用
dictionary(Cpython 中的线程安全):制作字典global_dict["count"]=0,每次更新global_dict["count"]++,然后读取global_dict["count"]>1000。 - 使用
global变量,使用global关键字(社区似乎最不推荐的关键字) - 使用
redis(避免,因为它是网络调用的额外负担):redis.set()开始,redis.get()获取值 - 使用
threading.local对象(感觉是最安全的对象),但我可能需要将检查计数减少到200以达到相同的结果。
【问题讨论】:
标签: python multithreading multiprocessing thread-safety gil