day36
今日内容
1.GIL解释器锁
2.GIL解释器锁与自定义锁
3.死锁现象与递归锁
4.信息量
5.Event
6.线程queue
1.GIL解释器锁
from multiprocessing import Process
'''
因为Cpython解释器中有一个垃圾回收机制,而每个进程下的线程运行代码时,都需要调用该进程内的Cpython解释器代码,同时每一段进程内都会有一个垃圾回收线程,
若Cpython解释器没有这一个GIL锁就会导致线程在运行代码的同时,垃圾回收线程也被同时运行,就会有可能将普通线程产生的一些空间直接当作垃圾被垃圾回收线程
回收,这样就是一种thread safe,所以GIL解释器锁的作用就是为了保证thread safe。
'''
from threading import Thread
import time,os def task():
time.sleep(2)
# n=0
# for i in range(10000000):
# n+=i if __name__ == '__main__':
print(os.cpu_count())
l=[]
for i in range(8):
s = time.time()
# p = Process(target=task)
t = Thread(target=task)
l.append(t)
t.start()
for i in l:
i.join()
print(time.time()-s)
2.GIL解释器锁与自定义锁
自定义锁时用来将python代码中的一部分代码从并发变成串行的
from threading import Thread,Lock
import time
metux = Lock()
n = 100
def task():
global n
metux.acquire()
temp = n
time.sleep(0.1)
n=temp-1
metux.release() if __name__ == '__main__':
l = []
for i in range(100):
p = Thread(target=task)
l.append(p)
p.start() for i in l:
i.join()
print(n)
3.死锁现象与递归锁
死锁现象
正常的互斥锁,如果被多次使用,是很容易出现死锁现象的,所以应该使用递归锁
from threading import Thread,Lock
import time class Mythread(Thread):
def run(self):
foo1(self.name)
foo2(self.name)
metuxA = Lock()
metuxB = Lock()
def foo1(name):
metuxA.acquire()
print('%s抢到了A锁'%name)
metuxB.acquire()
print('%s抢到了B锁' % name)
metuxB.release()
metuxA.release() def foo2(name):
metuxB.acquire()
print('%s抢到了B锁' % name)
time.sleep(2)
metuxA.acquire()
print('%s抢到了A锁' % name)
metuxB.release()
metuxA.release() if __name__ == '__main__':
for i in range(10):
p = Mythread()
p.start()
递归锁RLock
递归锁:实在锁上加一个标签如果上一次锁就加一,解锁就减一,直到标签为0才能被别的线程再去使用,否则别的线程一直处于阻塞状态
from threading import Thread,RLock
import time class Mythread(Thread):
def run(self):
foo1(self.name)
foo2(self.name)
metuxA = RLock()
metuxB = RLock()
def foo1(name):
metuxA.acquire()
print('%s抢到了A锁'%name)
metuxB.acquire()
print('%s抢到了B锁' % name)
metuxB.release()
metuxA.release() def foo2(name):
metuxB.acquire()
print('%s抢到了B锁' % name)
time.sleep(2)
metuxA.acquire()
print('%s抢到了A锁' % name)
metuxB.release()
metuxA.release() if __name__ == '__main__':
for i in range(10):
p = Mythread()
p.start()
4.信息量
from threading import Thread,Semaphore
import time,random
xh = Semaphore(5) def task(name):
xh.acquire()
print('%s进入图书馆'%name)
time.sleep(random.randint(1,3))
# print('%s离开图书馆' % name)
xh.release() if __name__ == '__main__':
for i in range(20):
q = Thread(target=task,args=('路人%s'%i,))
q.start()
5.Event
from threading import Thread,Event
import time
event = Event()
def light():
print('红灯亮起,无法通行')
time.sleep(3)
event.set()
print('绿灯亮起,车辆通行') def task(name):
print('车辆%s,正在等待'%name)
event.wait()
print('车辆%s,通过'%name) if __name__ == '__main__':
t1 = Thread(target=light)
t1.start() for i in range(10):
t = Thread(target=task,args=(i,))
t.start()
6.线程queue
import queue # q = queue.Queue()#队列 先进先出
# q.put('阿飞')
# q.put('大猴子')
# q.put('天天笑')
#
# print(q.get())
# print(q.get())
# print(q.get())
# q = queue.LifoQueue()#堆栈 先进后出
# q.put('阿飞')
# q.put('大猴子')
# q.put('天天笑')
#
# print(q.get())
# print(q.get())
# print(q.get())
q = queue.PriorityQueue()#优先级 优先级越高先出(数字越小优先级越高)
q.put((1,'阿飞'))
q.put((5,'大猴子'))
q.put((-6,'天天笑')) print(q.get())
print(q.get())
print(q.get())
day36的更多相关文章
- day36 爬虫+http请求+高性能
爬虫 参考博客:http://www.cnblogs.com/wupeiqi/articles/5354900.html http://www.cnblogs.com/wupeiqi/articles ...
- day36——死锁、递归锁、信号量、GIL、多线程实现socket通信、线程池和进程池
day36 死锁现象与递归锁 死锁现象 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这 ...
- day36 GIL锁与线程池
多进程与多线程效率对比 # # """ # # 计算密集型 # """ # from threading import Thread # f ...
- python 全栈开发,Day36(作业讲解(大文件下载以及进度条展示),socket的更多方法介绍,验证客户端链接的合法性hmac,socketserver)
先来回顾一下昨天的内容 黏包现象粘包现象的成因 : tcp协议的特点 面向流的 为了保证可靠传输 所以有很多优化的机制 无边界 所有在连接建立的基础上传递的数据之间没有界限 收发消息很有可能不完全相 ...
- day36 数据库表操作 数据类型 完整性约束
今日内容 1.存储引擎表类型 2.数据类型 3.完整性约束 1.存储引擎表类型 指令: 1.show engines:#查看MySQL所有的引擎, 2.show variables like &quo ...
- Day36 数据库的操作
视图操作: 1.左连接查询 select * from person left join dept on person.dept_id = dept.did 2. 右连接 3. 内连接 inner ...
- 进程 day36
python之路——进程 阅读目录 理论知识 操作系统背景知识 什么是进程 进程调度 进程的并发与并行 同步\异步\阻塞\非阻塞 进程的创建与结束 在python程序中的进程操作 multipro ...
- 操作系统的发展史 day36
什么是操作系统 可能很多人都会说,我们平时装的windows7 windows10都是操作系统,没错,他们都是操作系统.还有没有其他的? 想想我们使用的手机,Google公司的Androi ...
- day36(动态代理)
动态代理 动态代理:是实现增强类中的一种方式,jdk中的动态代理:Proxy对象,使用最广泛的是在AOP切面编程中. 实现一个简单的动态代理来了解其中的运行机制. 创建一个接口:Person类型的接口 ...
- 撩课-Web大前端每天5道面试题-Day36
1.介绍一下你对浏览器内核的理解? 主要分成两部分:渲染引擎(layout engineer或Rendering Engine)和JS引擎. 渲染引擎:负责取得网页的内容(HTML.XML.图像等等) ...
随机推荐
- (二)windows上使用docker
参考文献: 1.下载CentOS7镜像 Docker中使用CentOS7镜像 2.使用docker 在Windows里使用Docker 3.使用docker docker学习笔记(windows/ce ...
- git使用相关记录
上传github操作记录:https://blog.csdn.net/pql925/article/details/72772660 git提交仓库相关:https://blog.csdn.net/M ...
- Jquery 打开新页面
1.在click事件触发时,先打开空白页面 var newWeb=window.open('_blank'); 2.在事件操作后,写入空白页面的链接 newWeb.location='新页面的链接地址 ...
- 关于Web中列表页面的加载问题
2017年5月23日,天气晴朗.尽管昨晚睡的不踏实,好在今天心情还不是很糟糕,近来事情颇多,尤其是对于TA的改变,至少目前还是没有习惯,但时间将会解决一切,这点深有体会.此时此刻,又想起了苏东坡的那首 ...
- IDEA项目搭建二——使用SpringBoot创建Web层
一.编写底层代码 1.demo-common中创建FormatString类 先在默认com.tyh中创建package命名为common 删除自动生成的app.java,在common包下创建新类 ...
- FineReport单行与数据库交互的方法
1. 问题描述 我们在做一张报表填报的时候经常会遇到需要在一行进行添加动作,将该行数据直接与数据库交互,执行存储过程过程.我们可以通过每一行增加帆软“插入”按钮实现插入动作,并且在控件事件中增加和 ...
- View的measure机制
Android中View框架的工作机制中,主要有三个过程: 1.View树的测量(measure)Android View框架的measure机制 2.View树的布局(layout) And ...
- Expo大作战(五)--expo中app.json 文件的配置信息
简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...
- spring-bean 版本的问题(报错:org.xml.sax.SAXParseException; lineNumber: 14; columnNumber: 75;)
当XML中配置的xsd是4.0,而引用的包是4以下的spring-bean.jar时,当服务器能连网时没问题,不能连网时,就报以下类似错误: org.xml.sax.SAXParseException ...
- CentOS7 中安装 MySQL
0. 说明 参考 centos7.2安装MySQL CentOS 7 下 Yum 安装 MySQL 5.7 两种方式安装 MySQL 安装 MySQL(yum) & 安装 MySQL(yum) ...