加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 服务器 > 安全 > 正文

聊聊 Python 里关于线程安全的那些事儿

发布时间:2022-07-18 09:26:09 所属栏目:安全 来源:互联网
导读:在并发编程时,如果多个线程访问同一资源,我们需要保证访问的时候不会产生冲突,数据修改不会发生错误,这就是我们常说的线程安全 。 1. 线程不安全是怎样的? 要搞清楚什么是线程安全,就要先了解线程不安全是什么样的。 比如下面这段代码,开启两个线程,
  在并发编程时,如果多个线程访问同一资源,我们需要保证访问的时候不会产生冲突,数据修改不会发生错误,这就是我们常说的线程安全 。
 
  1. 线程不安全是怎样的?
 
  要搞清楚什么是线程安全,就要先了解线程不安全是什么样的。
 
  比如下面这段代码,开启两个线程,对全局变量 number 各自增 10万次,每次增量 1。
 
  2. 什么是原子操作?
 
  原子操作(atomic operation),指不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束,中间不会切换到其他线程。
 
  它有点类似数据库中的 事务。
 
  在 Python 的官方文档上,列出了一些常见原子操作
 
  复制
  L.append(x)
  L1.extend(L2)
  x = L[i]
  x = L.pop()
  L1[i:j] = L2
  L.sort()
  x = y
  x.field = y
  D[x] = y
  D1.update(D2)
  D.keys()
 
  而下面这些就不是原子操作
 
  复制
  ii = i+1
  L.append(L[-1])
  L[i] = L[j]
  D[x] = D[x] + 1
 
  像上面的我使用自增操作 number += 1,其实等价于 number = number + 1,可以看到这种可以拆分成多个步骤(先读取相加再赋值),并不属于原子操作。
 
  这样就导致多个线程同时读取时,有可能读取到同一个 number 值,读取两次,却只加了一次,最终导致自增的次数小于预期。

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读