栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

21.0并发编程(1~4)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

21.0并发编程(1~4)

4、 线程锁 互斥锁 的了解与使用

  python 中的线程是假线程 为什么这样说呢 这个是 python 的一个开发时候 设计的一个缺陷 因为同一时间执行的线程只有一个线程。

Python GIL(Global Interpreter Lock)

  Python 代码的执行由 Python 虚拟机(也叫解释器主循CPython 版本)来控制 Python 在设计之初就考虑到要在解释器的主循环中 同时只有一个线程在执行 即在任意时刻 只有一个线程在解释器中运行。对 Python 虚拟机的访问由全局解释器锁 GIL 来控制 正是这个锁能保证同一时刻只有一个线程在运行。

为什么要用这个 GIL 锁呢
  因为 Python 的线程是调用 C 语言的原生线程。因为 Python 是用 C 写的 启动的时候就是调用的 C 语言的接口。因为启动的 C 语言的远程线程 那它要调这个线程去执行任务就必须知道上下文 所以 Python 要去调 C 语言的接口的线程 必须要把这个上下文关系传给Python 那就变成了一个我在加减的时候要让程序串行才能一次计算。就是先让线程 1 再让线程 2…

  在上面这张图中 一个对象同时开启4个线程 并发 将程序交给CPython解释器 又由底层代码控制OS 操作系统 开启多个线程。缺陷 GIL锁谁拿到就可以进行计算 但是每一个线程计算的时间是一定的 到了时间线程必须结束中止 让下一个线程拿到GIL锁 这个不是按顺序来分配的 凭借谁的cpu计算能力强 然后拿到GIL锁的线程开始计算。当轮到有一个线程计算算完时 将会把算到结果返回数据num 则第二个线程开始运行时 开始计算的初值则是返回的这个num 所以就导致当数据过大时 会导致出错。

  线程调度本质上是不确定的 因此 在多线程程序中错误地使用锁机制可能会导致随机数据损坏或者其他的异常行为 我们称之为竞争条件。为了避免竞争条件 最好只在临界区 对
临界资源进行操作的那部分代码 使用锁。

代码例子

if __name__ __main__ :
num 0
# 创建线程列表
t_list []
# 循环创建线程
for i in range(5):
t Thread(target func1, args ( t{} .format(i),))
t.start()
t_list.append(t)
# 等待线程结束
for t in t_list:
t.join()

  Python 使用线程的时候 会定时释放 GIL 锁 这时会 sleep,所以才会出现上面的问题。面对这个问题 如果要解决此问题 我们可以使用 Lock 锁解决此问题。

from threading import Thread, Lock
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/267704.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号