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.图像等等) ...
随机推荐
- JAVA generic array 泛型数组
在JAVA中是不支持泛型数组的,不能通过 Z[] array=new Z[10] 这样的方式来创建数组,而是使用反射Aarry.newInstance来创建: 具体代码如下: public Z[][] ...
- onkeydown小练习
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 类与接口(五)java多态、方法重写、隐藏
一.Java多态性 面向对象的三大特性:封装.继承.多态. 多态的类型,分为以下两种: 编译时多态: 指的是 方法重载.编译时多态是在编译时确定调用处选择那个重载方法,所以也叫 静态多态,算不上真正的 ...
- CentOS6.8系统安装Node
环境:CentOS6.8_X64系统 一.到官方下载最新的编译好的安装文件,目前是6.9.4. $>cd /usr/local/src #定位到这个目录,下载的文件会在这个目录#使用wget下载 ...
- CentOS 7下安装Python3.5
CentOS 7下安装Python3.5 •安装python3.5可能使用的依赖 yum install openssl-devel bzip2-devel expat-devel gdbm-deve ...
- 2016年,谁是最受欢迎的 Java EE 服务器?
[编者按]本文作者为性能监控工具 Plumbr 创始人 Nikita Salnikov-tarnovski,主要介绍2016年度最广为使用的 Java EE 容器及其排名变化情况.本文系国内 ITOM ...
- Python数据类型之dict和set
Python内置了字典:dict的支持.在其他语言中也成为map,使用键-值(key-value)存储,具有极快的查找速度. 把数据放入dict的方法,除了初始化时指定外,还可以通过key放入. 由于 ...
- innodb 表锁和行锁
表锁 表锁相关结构: table->locks:数据字典table保存这个表上的所有表锁信息 trx->lock.table_locks:每个事务trx保存该事务所加的所有表锁信息 tr ...
- 超经典sql练习题,在teradata上实现
题目来源:https://blog.csdn.net/flycat296/article/details/63681089 teradata实现: drop table student; create ...
- centos7 安装 jdk1.8
首先是Linux的不同版本的额系统自带的配置是不一样的,比如centos6上有的自带的jdk环境的话要装1.8的就要进行卸载或者马上进行更改 jdk是java程序依赖的环境 首先查看你的系统下是否有j ...