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的多线程是否有用需 ...
随机推荐
- redis3.0集群部署和测试
redis3.0集群部署和测试 环境介绍 两台Centos7的虚拟机模拟6个节点,A台3个master节点,B台3个slave节点A地址:172.16.81.140B地址:172.16.81.141r ...
- oc中的oop基础及类的基本介绍
面向对象的(OOP)的基础知识 类(class):表示一组对象数据的结构体,对象通类来得到自身.类名首字母大写. 对象(objcet):是一种包含值和指向其类的隐藏指针的结构体.运行中的程序中通常会有 ...
- android 中的Http请求类HttpUrlConnection和HttpClient类
Android系统提供了两种HTTP通信类,HttpURLConnection和HttpClient. 如何选择这两个类的使用:android-developers.blogspot.com/2011 ...
- 四:理解Page类的运行机制(例:基于PageStatePersister的页面状态存取)
有人说类似gridview datalist这样的控件最好不要用在高并发,IO大的网站中企业应用中为了快速开发到可以用一用因为这是一类"沉重"的组件我们姑且不谈这种看法的正确性(我 ...
- 从零开始学 Web 之 Vue.js(二)过滤器,按键修饰符,自定义指令
大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...
- Java 8 新特性-菜鸟教程 (6) -Java 8 Optional 类
Java 8 Optional 类 Optional 类是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象. Optional 是个容 ...
- JS下计算当前日期(当天)后N天出现NAN或者undefined的情况
前言: 帮客户做一个订单系统,需要一个日期1,一个日期2,默认情况下日期1为当天,日期2为明天,只是当时有些疑惑的是日期2偶尔会出现NAN的情况,今天在segmentfault.com看到了同样的问题 ...
- js获取带#号链接后的参数
现在许多的主流网站都将'#'大规模用于重要URL中,我们通过正则表达式和window.location.search获取参数已经行不通了. 一.'#'号是什么 1.#代表网页中的一个位置.其后面的字符 ...
- 使用Asp.Net Core MVC 开发项目实践[第二篇:EF Core]
在项目中使用EF Core还是比较容易的,在这里我们使用的版本是EF Core 2.2. 1.使用nuget获取EF Core包 这个示例项目使用的是SQLSERVER,所以还需要下载Microsof ...
- RIP笔记
RIP(工作中没见人用过这种古老的协议,了解一下距离矢量的思想即可) RIPv2支持VLSM但不支持CIDR RIP工作在应用层,用UDP封装,端口是520 无论是RIPv1还是RIPv2都既支持周期 ...