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.图像等等) ...
随机推荐
- python 判断字符串是字母 数字 大小写还是空格
str.isalnum() 所有字符都是数字或者字母,为真返回 Ture,否则返回 False. str.isalpha() 所有字符都是字母(当字符串为中文时, 也返回True),为真返回 T ...
- Webpack 常用命令总结以及常用打包压缩方法
前言:Webpack是一款基于node的前端打包工具,它可以将很多静态文件打包起来,自动处理依赖关系后,生成一个.js文件,然后让html来引用,不仅可以做到按需加载,而且可以减少HTTP请求,节约带 ...
- for循环中嵌套setTimeout,执行顺序和结果该如何理解?
这两天在捣鼓作用域的问题,有的时候知识这个东西真的有点像是牵一发而动全身的感觉.在理解作用域的时候,又看到了一道经典的面试题和例子题. 那就是在for循环中嵌套setTimeout延时,想想之前面试的 ...
- Echarts图表常用功能配置,Demo示例
先看下效果图: 就如上图所示,都是些常用的基本配置. Legend分页,X轴设置,Y轴设置,底部缩放条设置, 数值显示样式设置,工具箱设置,自定义工具按钮, 绑定点击事件等等.这些配置代码中都做了简单 ...
- Nginx的虚拟主机
1.虚拟主机的概念和类型 1.1 概念: 所谓的虚拟主机,在web服务里面就是一个独立的网站站点,这个站点对应独立的域名(也有可能是IP或者端口),具有独立的程序和资源目录,可以独立的对外提供服务. ...
- linux并发服务器设计
linux 并发服务器: http://blog.csdn.net/ygl840455828ygl/article/details/52438167 http://www.2cto.com/os/20 ...
- JSP指示元素<%@ %> 与指示类型
JSP提示元素 <%@ 指示类型 [属性="值"]%> 指示类型 指示类型有三种,分别是taglib.include.page taglib指示类型 用于引入标签库 ...
- LeetCode题解之 Merge k Sorted Lists
1.题目描述 2.问题分析 使用合并两个链表的方法,逐次合并,效率较低.可以考虑同时合并K个链表. 3.代码 ListNode* mergeKLists(vector<ListNode*> ...
- LeetCode题解之Remove Nth Node From End of List
1.题目描述 2.问题分析 直接计算,操作. 3.代码 ListNode* removeNthFromEnd(ListNode* head, int n) { if (head == NULL) re ...
- 如何将同一云服务下的虚拟机从经典部署模型迁移到 Azure Resource Manager
适用场景 用户希望将特定云服务下的所有虚拟机从经典部署模型(以下简称:ASM)迁移到 Azure Resource Manager(以下简称:ARM). Note 如果云服务下使用 VNET 也希望将 ...