博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
threading_local
阅读量:4993 次
发布时间:2019-06-12

本文共 2076 字,大约阅读时间需要 6 分钟。

当我们使用线程时,如果多线程同时对一个全局变量进行修改,很容易造成错误,这是我们可以利用加锁的方式,让线程一个一个进行操作

同样我们可以threading.local来实现

threading.local的使用

不使用threading.local时

from threading import Threadfrom threading import localimport time# xianglong = local()xianglong = -1def task(arg):    global xianglong    xianglong = arg    time.sleep(2)    print(xianglong)for i in range(10):    t = Thread(target=task,args=(i,))    t.start()

输出结果

9999999999

可以看到,由于所以的线程都在修改同一个全局变量,导致最后无法得到想要的结果

使用threading.loacl

from threading import Threadfrom threading import localimport timefrom threading import get_ident# 特殊的对象xianglong = local()def task(arg):    # 对象.val = 1/2/3/4/5    xianglong.value = arg    time.sleep(2)     print(xianglong.value)for i in range(10):    t = Thread(target=task,args=(i,))    t.start()

输出结果

0123546789

使用了threading.local会为每一个线程创建一个独立的空间存储变量

get_ident

我们可以通过get_ident来获取每一个线程的独特的值,类似于线程号

from threading import Threadfrom threading import get_identdef task(arg):    print(get_ident())for i in range(10):    t = Thread(target=task,args=(i,))    t.start()

输出结果

5028608873408384864833728752562063084396

自己写一个类似于threading的功能

try:    from greenlet import getcurrent as get_identexcept Exception as e:    from threading import get_identfrom threading import Threadimport timeclass Local(object):    def __init__(self):        object.__setattr__(self,'storage',{})    def __setattr__(self, k, v):        ident = get_ident()        if ident in self.storage:            self.storage[ident][k] = v        else:            self.storage[ident] = {k: v}    def __getattr__(self, k):        ident = get_ident()        return self.storage[ident][k]obj = Local()def task(arg):    obj.val = arg    obj.xxx = arg    print(obj.val)for i in range(10):    t = Thread(target=task,args=(i,))    t.start()

用.给对象设置值时会调用__setattr__方法,这里我们导入时使用了try捕捉异常,先导入协程的get_ident,如果没有则导入线程的,所以我们的方法比threading.loacl多了一个实现协程的功能,不同的线程可以在obj对象的storage字典中利用自己的get_ident值为键生成对

应的值,在定义self.storage时我们调用的是父类object类的__setattr__方法,那是因为我们自己的类定义了这个方法,直接使用self.storage={}会执行自己类的__setattr__方法,会出问题

转载于:https://www.cnblogs.com/weiwu1578/articles/8965762.html

你可能感兴趣的文章
!!和??
查看>>
matlab演奏卡农 Cripple Pachebel's Canon on Matlab
查看>>
apache的MPM机制-prefork
查看>>
js的一些实用的小技巧
查看>>
vue-cli中理不清的assetsSubDirectory 和 assetsPublicPath
查看>>
iOS的UILabel设置居上对齐,居中对齐,居下对齐
查看>>
最流行的android组件大全
查看>>
【Android自定义控件】支持多层嵌套RadioButton的RadioGroup
查看>>
Swift - 内存泄露原因(循环强引用)及解决办法
查看>>
AIDL-Android接口描述语言实现跨进程通讯
查看>>
剑指Offer - 九度1354 - 和为S的连续正数序列
查看>>
LeetCode - Anagrams
查看>>
用MFC时,如果程序崩溃,检查内存,然后注意GDI数量,在任务管理器里选项-查看列-GDI数量...
查看>>
angular(转)
查看>>
ansible简单现网配置
查看>>
数据结构C++版-树
查看>>
JavaScript学习总结--创建对象(3_原型)
查看>>
FZU 2092 收集水晶 dp+bfs
查看>>
Java学习---网页编辑器FCKeditor使用详解
查看>>
IDEA开发React环境配置
查看>>