美文网首页
Python线程安全

Python线程安全

作者: 521851ef | 来源:发表于2018-07-22 00:25 被阅读0次

原子性判断

在《关于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不是线程安全的。

相关文章

  • GIL线程全局锁

    线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的...

  • python : valueerror: unknown el

    matplotlib 是进程安全的,不是线程安全的。应该使用python的multiprocessing.Pool...

  • Python线程安全

    原子性判断 在《关于Python GIL》里提到,默认情况下每隔100个tick强制释放一次GIL,相对于具体业务...

  • Python线程安全

    因为python的GIL锁,queue这种结构体是线程安全的,因为它执行的是原子性操作 大部分结果:[10000]...

  • python之多线程与多进程入门

    python之多线程与多进程 关键词: GIL锁,IO繁忙,线程安全,线程同步,进程池,进程通信,队列 GIL锁;...

  • 线程优先级队列

    Queue模块可以用来进行线程间的通信,让各个线程之间共享数据Python的Queue模块提供了同步、线程安全的队...

  • 每周一个 Python 模块 | Queue

    专栏地址:每周一个 Python 模块 Queue 是 Python 标准库中的线程安全的队列(FIFO)实现,提...

  • python爬虫-25-python多线程安全队列Queue详解

    1、python之Queue介绍 Python中的queue模块中提供了同步的、线程安全的队列类,包括FIFO(先...

  • Python的100天打卡(下)

    7.10 1.多线程 程序需要维护许多共享的状态(尤其是可变状态),Python中的列表、字典、集合都是线程安全的...

  • 11-9 多线程和多进程

    Python的GIL是针对进程还是线程?  是线程 Python多核cpu可以运行多线程吗? Python线程执行...

网友评论

      本文标题:Python线程安全

      本文链接:https://www.haomeiwen.com/subject/jfokmftx.html