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 ...
随机推荐
- 前端---css3优化
一.视差滚动(经过优化后的代码) .front::before { content: ''; position: fixed; // 代替background-attachment width: 10 ...
- 一次 Druid 连接池泄露引发的血案!
最近某个应用程序老是卡,需要重启才能解决问题,导致被各种投诉,排查问题是 Druid 连接池泄露引发的血案.. 异常日志如下: ERROR - com.alibaba.druid.pool.GetCo ...
- vnstat 流量统计 并附带一个小 php 查看流量的页面
安装apt-get install vnstat 配置到自动启动update-rc.d vnstat enable 启动/etc/init.d/vnstat start vnstat基本使用命令 vn ...
- 【工具】---- webpack简析
1. 什么是webpack 一个现代 JavaScript 应用程序的静态模块打包器(module bundler),它会分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行 ...
- 添加bash命令
cd ~/.bash vim mya 键入 #!/bin/bash hostname -i :x 保存退出 source ~/.bash_profile 生效
- h5微信中视频禁止全屏
<video id="videoPlayer" v-show="isShowVideo" class="video" ref=&quo ...
- 使用express+shell在服务器上搭建一套简单的前端部署系统
前言 个人项目越来越多,部署需要频繁操作服务器,所以手动搭建一套简单的部署系统. 效果如图 其中包含 原生html+css+js项目,单页面react, vue, angular项目,实现了一键打包发 ...
- Natas32 Writeup(Perl 远程代码执行)
Natas32: 打开后和natas31相似的界面,并且提示,这次您需要证明可以远程代码执行,Webroot中有一个二进制文件可以执行. my $cgi = CGI->new; if ($cgi ...
- CSRF和XSS区别和预防
名词解释 CSRF(Cross-site request forgery)跨站请求伪造 XSS (Cross-site scripting)跨站脚本攻击,这里缩写css被前端层叠样式表(Cascadi ...
- ABP实践(4)-abp前端vue框架之简单商品增删改查(帮助刚入门的新手快速了解怎么才能加入自己的功能并运行起来)
提示:如有不明白的地方请先查看前3篇ABP实践系列的文章 1,下载及启动abp项目前后端分离(netcore+vue) 2,修改abp数据库为mysql 3,商品系列api接口(本文主要依赖在这个商品 ...