Python线程安全

原子性判断

在《关于Python GIL》里提到,默认情况下每隔100个tick强制释放一次GIL,相对于具体业务而言,这具有极强的随机性,因为你也不知道自己的代码在执行过程中什么时候就被释放了GIL。使用dis.dis可以查看bytecode,我们默认一个bytecode(可能)具有原子性,即单bytecode的Python语句才(可能)有原子性。

之所以说可能有原子性,是指这条语句不会因每隔100个tick强制释放GIL的CPython默认行为失去原子性,但不能保证调用函数内部不会主动释放GIL,可以参考《关于Python GIL》中accept的例子。

由此引发的思考是,仅用dis.dis判断语句的bytecode数决定是否需要加锁,其实并不科学

原子操作

对基本类型(包括list或者dict在内的容器)本身的操作是可以做到线程安全的,比如:

  • 获取局部变量的值或对其赋值
  • 获取全局变量的值或对其赋值
  • list中取值
  • dict中取值
  • list的在位修改操作(比如append
  • dict的在位修改操作(比如增加元素)

获取元素的值,修改值,再写会并不是线程安全的,比如:

  • i = i + 1 # 先获取i的值,然后相加,再赋值
  • L.append(L[-1]) # 先获取L[-1]的值,然后再append到L中
  • L[i] = L[j] # 先获取L[j]的值,再赋值给L[i]
  • D[x] = D[x] + 1 先获取D[x]的值,然后相加,再赋值

综上,listdict不是线程安全的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 用于python面试整理,主要来源于http://www.cnblogs.com/skiler/p/6952707...
    十里江城阅读 2,395评论 0 13
  • 适合于自我疗愈成长,自我修习的九大原则: 一、“生活在现在”。 不要为明天担心,也不要总是为昨天而后悔,把你的精神...
    爱真地身心灵成长阅读 540评论 0 0
  • 世事翻云覆雨,正是因为懂得你的难处,方能与你比肩而立,共看沧海变桑田。 人活一辈子,遇见的人太多太多,可最终真正知...
    幸福之神建飞阅读 163评论 0 0
  • 这是一本联合创作的书籍,作者都是学富五车世界顶尖的一流学者。感兴趣的同学可以去百度他们的生平,而我已经迫不及待地想...
    俏皮的小天使阅读 186评论 0 1
  • 有时我不知道该如何评价你。说你不懂事吧,有时又挺懂事的,说你懂事吧却又常常把我气个半死。 为什么你和我小时候一点都...
    花开暖暖吖阅读 409评论 3 0