Python多线程同步互斥锁
接着上篇多线程继续讲,上篇最后的多线程共享全局变量对变量的处理值出错在本文中给出解决方案。
出现这个情况的原因是在python解释器中GIL全局解释器锁。
GIL:全局解释器锁,每个线程在执行的过程都需要先获取GIL,保证同一时刻只有一个线程而已执行代码
线程释放GIL锁的情况:在IO操作等呃能会引起阻塞的system call之前,可以暂时释放GIL
但在执行完毕后,必须重新获取GIL, Python3中使用计时器(执行时间打到阀值后,当前线程释放GIL)
python使用多线程是并发 可以使用多线程利用多核的CPU资源
cpu密集型:也成为计算密集型,任务的特点是要进行大量的计算,消耗cpu资源,比如计算圆周率、对视频进行高清解码等等
全靠cpu的运算能力 这个时候单线程快
io密集型:涉及到网络、磁盘IO的任务都是IO密集型任务,这类任务的特点是CPU消耗很少,任务的大部分时间都在等待IO操作完成,因为 IO的速度远远低于CPU和内存的速度 这个时候多线程快。
那么如何解决多线程共享全局变量数据错误的问题呢,引入锁。
import threading a = 100 def func1():
global a
for i in range(1000000):
meta.acquire() # 上锁
a += 1
meta.release() # 释放锁
print(a) def func2():
global a
for i in range(1000000):
meta.acquire()
a += 1
meta.release()
print(a) # 创建锁
meta = threading.Lock() t1 = threading.Thread(target=func1)
t2 = threading.Thread(target=func2)
t1.start()
t2.start()
t1.join()
t2.join()
print(a)
至于锁的原理在下方粗略的画一张草图以供参考
使用锁让每个线程有序的切换执行,不会出现数据混乱。
但是在使用锁的时候要注意不要写出死锁代码,附死锁代码参考,总结一句就是互相持有对方线程所需要的锁,造成死锁
import threading a = 100 def func1():
global a
for i in range(1000000):
meta_A.acquire() # 上锁
meta_B.acquire() # 上多把锁 产生了死锁 看下面代码
print('-------------1')
a += 1
meta_B.release()
meta_A.release() # 释放锁
print(a) def func2():
global a
for i in range(1000000):
meta_B.acquire()
meta_A.acquire()
print('------------2')
a += 1
meta_A.release()
meta_B.release()
print(a) # 创建锁
meta_A = threading.Lock()
meta_B = threading.Lock() t1 = threading.Thread(target=func1)
t2 = threading.Thread(target=func2)
t1.start()
t2.start()
今天就写到这里,下一篇写一下队列
Python多线程同步互斥锁的更多相关文章
- C++11 多线程同步 互斥锁 条件变量
在多线程程序中,线程同步(多个线程访问一个资源保证顺序)是一个非常重要的问题,Linux下常见的线程同步的方法有下面几种: 互斥锁 条件变量 信号量 这篇博客只介绍互斥量和条件变量的使用. 互斥锁和条 ...
- 第十五章、Python多线程同步锁,死锁和递归锁
目录 第十五章.Python多线程同步锁,死锁和递归锁 1. 引子: 2.同步锁 3.死锁 引子: 4.递归锁RLock 原理: 不多说,放代码 总结: 5. 大总结 第十五章.Python多线程同步 ...
- python多线程同步实例分析
进程之间通信与线程同步是一个历久弥新的话题,对编程稍有了解应该都知道,但是细说又说不清.一方面除了工作中可能用的比较少,另一方面就是这些概念牵涉到的东西比较多,而且相对较深.网络编程,服务端编程,并发 ...
- python多线程threading.Lock锁用法实例
本文实例讲述了python多线程threading.Lock锁的用法实例,分享给大家供大家参考.具体分析如下: python的锁可以独立提取出来 mutex = threading.Lock() #锁 ...
- python多线程同步
python多线程同步 作者:vpoet 日期:大约在夏季 import threading import time mylock = threading.RLock() num=0 class my ...
- 总结windows多线程同步互斥
windows多线程同步互斥--总结 我的windows多线程系列文章: windows多线程--原子操作 windows多线程同步--事件 windows多线程同步--互斥量 windows多线程同 ...
- windows多线程同步互斥--总结
我的windows多线程系列文章: windows多线程--原子操作 windows多线程同步--事件 windows多线程同步--互斥量 windows多线程同步--临界区 windows多线程同步 ...
- Python 多线程同步队列模型
Python 多线程同步队列模型 我面临的问题是有个非常慢的处理逻辑(比如分词.句法),有大量的语料,想用多线程来处理. 这一个过程可以抽象成一个叫“同步队列”的模型. 具体来讲,有一个生产者(Dis ...
- 多线程、互斥锁、异步、GIL
多线程-threading python的thread模块是比较底层的模块,python的threading模块是对thread做了一些包装的,可以更加方便被使用 from threading imp ...
随机推荐
- mysql数据库远程访问设置方法
1. 修改方式1代码改表法. 可能是你的帐号不允许从远程登陆,只能在localhost.这个时候只要在localhost的那台电脑,登入mysql后,更改 "mysql" 数据库 ...
- php遍历文件夹中所有的文件
遍历文件夹中的所有文件 思路:1.定义一个函数,把给定的文件夹当前目录遍历输出(用到的文件操作函数scandir():一次性读取当前文件夹所有的内容并以数组的形式返回.). 2.如果是文件夹则红色字体 ...
- go源码分析(四) net包获取主机ip 子网掩码相关分析
获取本地的ip时 顺便学习了下标准库net中的实现 在net/interface.go中进行了入口调用,返回值为Addr的slice func InterfaceAddrs() ([]Addr, er ...
- 《自拍教程46》Python_adb自动拍照100张
Android手机测试, 涉及照相机(Camera)应用程序的稳定性测试的用例, 需要涉及100张照片的拍照自动化测试. 准备阶段 先清理老照片,照片一般存放在/scard/DCIM目录下 adb s ...
- 测试必知必会系列- Linux常用命令 - ls
21篇测试必备的Linux常用命令,每天敲一篇,每次敲三遍,每月一循环,全都可记住!! https://www.cnblogs.com/poloyy/category/1672457.html 列出当 ...
- 从零开始学习R语言(四)——数据结构之“数组(Array)”
本文首发于知乎专栏:https://zhuanlan.zhihu.com/p/60141207 也同步更新于我的个人博客:https://www.cnblogs.com/nickwu/p/125677 ...
- 阿里云服务器安装Docker
在阿里云服务器上安装Docker,服务器的系统是CentOS 7.6, 所以可以看官方Docker安装文档:https://docs.docker.com/install/linux/docker-c ...
- python的进制转换
转载于:https://www.cnblogs.com/FWF1944/p/11132409.html(方法论190404) Python整数能够以十六进制,八进制和二进制来编写,作为一般以10位基数 ...
- 动态规划-Cherry Pickup
2020-02-03 17:46:04 问题描述: 问题求解: 非常好的题目,和two thumb其实非常类似,但是还是有个一点区别,就是本题要求最后要到达(n - 1, n - 1),只有到达了(n ...
- springboot使用swagger2创建文档
一.导入swagger2依赖 <dependency> <groupId>io.springfox</groupId> <artifactId>spri ...