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.图像等等) ...
随机推荐
- lamp配置多个虚拟站点
在同一ip下添加多个域名站点! 1.查看ip 命令:ifconfig 2.添加域名 命令:vi /etc/hosts 输入域名:如 192.168.160.127 www.test.com 192 ...
- Oracle 远程链接oracle数据库服务器的配置
远程链接oracle数据库服务器的配置 by:授客 QQ:1033553122 原理: 一.Oracle客户端与服务器端的通讯机制 1.OracleNet协议 如下图所示,Oracle通过Oracle ...
- Linux服务器redhat配置本地yum源
前面给大家介绍了很多在Linux安装软件的知识,这些软件往往依赖了很多第三方的工具或者软件,如果在Linux服务器有外网的情况,咱们可以通过yum install这样的命令直接去安装这些相关的工具或者 ...
- maven学习笔记--window平台下的安装和一些基本的配置
maven官网:http://maven.apache.org/ 系统要求如下: 安装及配置步骤 (1)下载:到Maven 的官网上去下载windows版本的Maven的安装包!下载对应的zip 格式 ...
- Scala包的使用
package big.data.analyse.scala.classes /** * Created by zhen on 2018/9/15. */ object Packages { def ...
- MVC 上传下载
在Asp.net的WEBform中,上传文件与下载文件处理是很简单的事情,如果转为ASP.NET MVC呢?那就没有那么容易了,难少少,也不是很难,一起来看下本文吧.本文主要讲如何在Asp.net M ...
- 乘风破浪:LeetCode真题_023_Merge k Sorted Lists
乘风破浪:LeetCode真题_023_Merge k Sorted Lists 一.前言 上次我们学过了合并两个链表,这次我们要合并N个链表要怎么做呢,最先想到的就是转换成2个链表合并的问题,然后解 ...
- 第 15 章 位操作(binbit)
/*------------------------------------ binbit.c -- 使用位操作显示二进制 ------------------------------------*/ ...
- SQLite简单使用记录
SQLite,一种轻量级的数据库 想要使用的话首先下载安装包. https://www.sqlite.org/download.html 下载sqlite-netFx20-setup-bundle-x ...
- Beta阶段第五次冲刺
Beta阶段第五次冲刺 严格按照Git标准来,组员有上传Git的才有贡献分没有的为0 代码签入图 1.part1 -站立式会议照片 2.part2 -项目燃尽图 3.part3 -项目进展 1.正在进 ...