python第五十一天----线程,Event,队列
进程与线程的区别:
线程==指令集,进程==资源集 (线程集)
1、同一个进程中的线程共享内存空间,进程与进程之间是独立的
2、同一个进程中的线程是可以直接通讯交流的,进程与间通讯必需通过一个中间的代理才能实现
3、创建线程简单,创建进程,是克隆父进程
4、一个线程可以控制和操作同一进程里的其他线程,但进程只能操作子进程
5、线程启动速度快,进程启动速度比较慢
线程示例:
import time ,threading def run(attr):
print('输出:',attr)
time.sleep(3) t1=threading.Thread(target=run,args=('第一个线程',))
t2=threading.Thread(target=run,args=('第二个线程',)) t1.start()#启动线程1
t2.start()#启动线程2
def run2(attr):
print('输出:',attr)
time.sleep(3) run2('第一个线程')
run2('第二个线程')
#以上转为串联执行
继承线程 类写线程
#!usr/bin/env python
#-*-coding:utf-8-*-
# Author calmyan import threading,time class thre(threading.Thread):#继承线程中的类
def __init__(self,n,times):
super(thre,self).__init__()
self.n=n
self.teims=times
def run(self):
print('执行第一线程:',self.n)
time.sleep(self.teims) star_time=time.time()
t1=thre('第一线程',3)
t2=thre('第二线程',4)
t1.start()
t2.start()
t1.join()#join等待该线程执行完成 t2.join()
den_time=time.time()-star_time
print(den_time)
等待线程执行完成,用.join
import time ,threading
lock=threading.Lock()#定义一个线程锁变量
def run(attr):
lock.acquire()#申请一个线程锁
global num
print('输出:',attr)
#time.sleep(3)
num+=1
lock.release()#释放线程锁
time.sleep(3)
print('输出完成'.center(10,'〓'))
star_time=time.time()#开始时间 num=0
re_lilst=[]#定义一个列表
for i in range(50):
t1=threading.Thread(target=run,args=(('第%s线程'%i),))#新建线程
#t1.setDaemon(True)#设置为守护进程 当主线程完成,守护也停止
t1.start()#起动线程
re_lilst.append(t1)#不用JOIN,避免阻塞为串行 print(threading.current_thread(),threading.active_count())#查看线程 的主 子 活跃线程
#print('分线程'.center(40,'☆'))
print('数字:',num)
for i in re_lilst:#等待线程 完成
i.join()
print('数字:',num)
print('主线程'.center(60,'◇'),threading.current_thread(),threading.active_count()) den_time=time.time()-star_time#总共时间
print(den_time)
守护进程,相当于主进程的下属,当主进程结束,无论守护进程内的是否执行完成,都会停止!
import time ,threading
lock=threading.Lock()#定义一个线程锁变量
def run(attr):
lock.acquire()#申请一个线程锁
global num
print('输出:',attr) #time.sleep(3)
num+=1
lock.release()#释放线程锁
time.sleep(3)
print('输出完成'.center(10,'〓')) star_time=time.time()#开始时间 num=0
re_lilst=[]#定义一个列表
for i in range(50):
t1=threading.Thread(target=run,args=(('第%s线程'%i),))#新建线程
t1.setDaemon(True)#设置为守护进程 当主线程完成,守护也停止
t1.start()#起动线程
re_lilst.append(t1)#不用JOIN,避免阻塞为串行 print(threading.current_thread(),threading.active_count())#查看线程 的主 子 活跃线程
#print('分线程'.center(40,'☆'))
print('数字:',num)
# for i in re_lilst:#等待线程 完成
# i.join()
print('数字:',num)
print('主线程'.center(60,'◇'),threading.current_thread(),threading.active_count()) den_time=time.time()-star_time#总共时间
print(den_time)
线程锁,在py3中可以不使用:
lock=threading.Lock()
lock.acquire()
递归锁 用于递归线程
import time ,threading def run(i):
print('输出:-------',i)
lock.acquire()#申请锁
global num1
num1+=1
time.sleep(0.1)
lock.release()#释放锁
return num1 def run2(i):
lock.acquire()#申请锁
global num2
print('输出:22',i)
num2+=1
time.sleep(0.1)
lock.release()#释放锁
return num2 def run3(i):
lock.acquire()#申请锁
res=run(i)
print('输出:333',i)
res2=run2(i)
time.sleep(0.1)
print(res,res2)
lock.release()#释放锁 if __name__ == '__main__':
star_time=time.time()#开始时间\
num1,num2=0,0
#lock=threading.Lock()#定义一个线程锁,如是线程锁,递归时会出错
lock=threading.RLock()#定义一个递归锁 for i in range(10):
#t1=threading.Thread(target=run,args=(('第%s线程'%i),))#新建线程
t1=threading.Thread(target=run3,args=(('第%s线程'%i),))#新建线程
t1.start()#起动线程 else:
print('活跃线程数:',threading.active_count())#查看线程 活跃线程数 while threading.active_count()!=1:#不只一个线程,就是说,判断是否是剩下主线程
#print(threading.active_count())#查看线程 活跃线程数
pass
else:
print('主线程:pid,活跃线程数'.center(60,'◇'),threading.current_thread(),threading.active_count())#
den_time=time.time()-star_time#总共时间
print(den_time)
print(num1,num2)
信号量 相当与 多个线程锁
#!usr/bin/env python
#-*-coding:utf-8-*-
# Author calmyan #!usr/bin/env python
#-*-coding:utf-8-*-
# Author calmyan
import time ,threading def run(attr):
semaphore.acquire()#申请信号量线程锁
global num
print('输出:',attr)
time.sleep(1)
semaphore.release()#释放信号量线程锁 star_time=time.time()#开始时间
if __name__ == '__main__': semaphore=threading.BoundedSemaphore(4)#信号量 最多允许几个线程同时运行(多把锁)
for i in range(50):
t1=threading.Thread(target=run,args=(('第%s线程'%i),))#新建线程
t1.start()#起动线程 while threading.active_count()!=1:#不只一个线程,就是说,判断是否是剩下主线程
pass
else:
print('主线程'.center(60,'◇'),threading.current_thread(),threading.active_count())
den_time=time.time()-star_time#总共时间
print(den_time)
Event 线程标志
红绿灯示例
#!usr/bin/env python
#-*-coding:utf-8-*-
# Author calmyan import threading,time event=threading.Event()#生成一个标示位对象
def lighter():#
count=0 #定义时间秒数
event.set()#设置标志位
while True:
if count>9 and count<15:#设定为红灯
event.clear()#清除标志位,
print('\033[41;1m变为红灯!\033[0m')
elif count>=15 and count<18 :#为黄灯 print('\033[43;1m变为黄灯!\033[0m')
elif count>=18:
event.set()#设置标志位
print('\033[42;1m变为绿灯!\033[0m')
count=0#重新计时
else:
print('\033[42;1m绿灯中.....!\033[0m')
time.sleep(1)
count+=1#每一秒钟加一次 def car(name):
while True:
if event.is_set():#如果有标志 说明为绿灯
print('[%s]在行驶中....'%name)
time.sleep(1)
else:
print('[%s]在等待中.....'%name)
event.wait()#等待获取标志
print('绿灯亮了,[%s]继续行驶...'%name)
time.sleep(1) light=threading.Thread(target=lighter,)#定义一个线程
light.start()#启动线程 car1=threading.Thread(target=car,args=('红旗轿车',))#生成一个汽车线程
car1.start()
队列 生产者消费者模型
#!usr/bin/env python
#-*-coding:utf-8-*-
# Author calmyan #队列 生产者消费者模型 import threading,time,queue q=queue.Queue()#创建一个队列 def produ(name):#生产函数
count=0
while True:
bz=name+str(count)
q.put(bz)
print('[%s]生产了,第[%s]个[%s]g 包子'%(name,count,bz))
count+=1
time.sleep(1.5) def consump(name):#消费者
while True:
i=q.get()#取
print('[%s]拿到包子[%s],并吃了'%(name,i))
time.sleep(0.5) p1=threading.Thread(target=produ,args=('王五包子铺',))#创建一个新线程 生产者
p2=threading.Thread(target=produ,args=('麻子六包子铺',))#创建一个新线程 生产者
r1=threading.Thread(target=consump,args=('张三',))#创建一个新线程 消费者
r2=threading.Thread(target=consump,args=('李四',))#创建一个新线程 消费者
p1.start()
p2.start()
r1.start()
r2.start()
python第五十一天----线程,Event,队列的更多相关文章
- 孤荷凌寒自学python第五十一天初次尝试使用python连接Firebase数据库
孤荷凌寒自学python第五十一天初次尝试使用python连接Firebase数据库 (完整学习过程屏幕记录视频地址在文末) 今天继续研究Firebase数据库,利用google免费提供的这个数据库服 ...
- Python第五十一天 python2升级为python3
Python第五十一天 python2升级为python3 公司使用的生产环境系统是centos7,所以这里以centos7系统为基础,讲解将python2升级为python3的方法 centos7 ...
- python 之 并发编程(线程Event、协程)
9.14 线程Event connect线程执行到event.wait()时开始等待,直到check线程执行event.set()后立即继续线程connect from threading impor ...
- python第五课——自定义线程池
内容概要: 1.low版线程池 2.绝版线程池 1.low版线程池 设计思路:运用队列queue 将线程类名放入队列中,执行一个就拿一个出来 import queue import threading ...
- python【第十一篇】消息队列RabbitMQ、缓存数据库Redis
大纲 1.RabbitMQ 2.Redis 1.RabbitMQ消息队列 1.1 RabbitMQ简介 AMQP,即Advanced Message Queuing Protocol,高级消息队列协议 ...
- python第五十一课——__slots
2.__slots__: 作用:限制对象随意的动态添加属性 举例: class Demo: __slots__ = ('name','age','height','weight') #实例化Demo对 ...
- 孤荷凌寒自学python第五十三天使用python写入和修改Firebase数据库中记录
孤荷凌寒自学python第五十三天使用python写入和修改Firebase数据库中记录 (完整学习过程屏幕记录视频地址在文末) 今天继续研究Firebase数据库,利用google免费提供的这个数 ...
- 孤荷凌寒自学python第五十二天初次尝试使用python读取Firebase数据库中记录
孤荷凌寒自学python第五十二天初次尝试使用python读取Firebase数据库中记录 (完整学习过程屏幕记录视频地址在文末) 今天继续研究Firebase数据库,利用google免费提供的这个数 ...
- python并发编程-多线程实现服务端并发-GIL全局解释器锁-验证python多线程是否有用-死锁-递归锁-信号量-Event事件-线程结合队列-03
目录 结合多线程实现服务端并发(不用socketserver模块) 服务端代码 客户端代码 CIL全局解释器锁****** 可能被问到的两个判断 与普通互斥锁的区别 验证python的多线程是否有用需 ...
随机推荐
- DFSMN结构快速解读
参考文献如下: (1) Deep Feed-Forward Sequential Memory Networks for Speech Synthesis (2) Deep FSMN for Larg ...
- Go并发编程之美-CAS操作
摘要: 一.前言 go语言类似Java JUC包也提供了一些列用于多线程之间进行同步的措施,比如低级的同步措施有 锁.CAS.原子变量操作类.相比Java来说go提供了独特的基于通道的同步措施.本节我 ...
- Spark SQL读取hive数据时报找不到mysql驱动
Exception: Caused by: org.datanucleus.exceptions.NucleusException: Attempt to invoke the "BoneC ...
- Linux编程 8 (挂载mount,查看磁盘df du,搜索grep,压缩zgip,归档tar)
一. 挂载存储媒体 linux文件系统将所有的磁盘都并入一个虚拟目录下,当使用新的存储媒体之前,需要把它放到虚拟目录下,这项工作称为挂载(mounting) 1.1 mount 命令 在linux上用 ...
- Code Complete-13/7/29
Measure Twice,Cut Once! 漫步到第三章: just is about upstream prerequisites. 在构建活动开始之前,准备工作要做的周全. Upstream ...
- 从零开始学 Web 之 CSS3(六)动画animation,Web字体
大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...
- Spring Boot + Spring Cloud 构建微服务系统(四):容错机制和熔断(Hystrix)
雪崩效应 在微服务架构中,由于服务众多,通常会涉及多个服务层级的调用,而一旦基础服务发生故障,很可能会导致级联故障,进而造成整个系统不可用,这种现象被称为服务雪崩效应.服务雪崩效应是一种因“服务提供者 ...
- 关系型数据库 VS NOSQL
转载:https://mp.weixin.qq.com/s/FkoOMY8_vnqSPPTHc2PL1w 行式数据库(关系型数据库) 行式数据库有如下几个缺点: 大数据场景下 I/O 较高,因为数据是 ...
- spring AOP 之二:@AspectJ注解的3种配置
@AspectJ相关文章 <spring AOP 之二:@AspectJ注解的3种配置> <spring AOP 之三:使用@AspectJ定义切入点> <spring ...
- JavaWeb学习(一)———JavaWeb入门
一.基本概念 1.1.WEB开发的相关知识 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资源分为: 静态web资源( ...