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的多线程是否有用需 ...
随机推荐
- [视频]K8飞刀 mysql注入点拿shell & UDF提权教程
[视频]K8飞刀 mysql注入点拿shell & UDF提权教程 链接: https://pan.baidu.com/s/1a7u_uJNF6SReDbfVtAotIw 提取码: ka5m
- 京东架构师的showtime京东个性化推荐系统实战
推荐系统核心任务是排序,从线上服务角度看,就是将数据从给定集合中数据选择出来,选出后根据一定规则策略方法进行排序. 线上服务要根据一定规则进行架构设计,架构设计是什么?每一次权衡取舍都是设计,设计需要 ...
- 函数isNaN() parseFloat() parseInt() Math对象
isNaN() 定义和用法 isNaN() 函数用于检查其参数是否是非数字值. isNaN(x) x 是特殊的非数字值 NaN(或者能被转换为这样的值) console.log(isNaN(NaN)) ...
- 从零开始学 Web 之 HTML5(二)表单,多媒体新增内容,新增获取操作元素,自定义属性
大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...
- zabbix yum安装
1. 安装zabbix yum源 rpm -Uvh https://repo.zabbix.com/zabbix/4.0/rhel/6/x86_64/zabbix-release-4.0-1.el6. ...
- java 访问剪切板(读取与设置)
设置文本到剪切板 public void setIntoClipboard(String data) { Clipboard clipboard = Toolkit.getDefaultToolkit ...
- MVC EF 执行SQL语句(转载)
MVC EF 执行SQL语句 最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精 闲着没事,看了一篇关于LI ...
- hadoop fs,hadoop dfs,hdfs dfs
hadoop fs: FS relates to a generic file system which can point to any file systems like local, HDFS ...
- 【Java深入研究】8、Java中Unsafe类详解
java不能直接访问操作系统底层,而是通过本地方法来访问.Unsafe类提供了硬件级别的原子操作,主要提供了以下功能: 1.通过Unsafe类可以分配内存,可以释放内存: 类中提供的3个本地方法all ...
- potplayer打开多个视频文件
选项-基本-多重处理方式-新开一个播放进程播放