Python入门学习-DAY35-线程
一、进程补充
1.进程间通信(IPC机制)
进程间通讯有两种方法:管道或者队列。
1 队列和管道都是将数据存放于内存中
2 队列又是基于(管道+锁)实现的,可以让我们从复杂的锁问题中解脱出来。
from multiprocessing import Queueq=Queue(3)#3是队列允许存在的个数 q.put('1') q.put('2') q.put('3')print(q.get(block=True,timeout=2)) print(q.get()) print(q.get())
block默认是True,意思是可以阻塞。timeout是阻塞时间,阻塞时间到了会报错
那么什么情况下会阻塞:
1.当限制队列里的数量时,放入超过限制的消息,会阻塞,等待第一个放入的被取走,才会继续执行
2.当限制队列里的数量时,取出超过限制的消息,因为此时的队列是空的,只有队列里再次放入内容时才会继续执行
2.生产者消费者模型
1. 什么是生产者消费者模型
生产者:代指生产数据的任务
消费者:代指处理数据的任务
该模型的工作方式:
生产生产数据传递消费者处理
实现方式:
生产者---->队列<------消费者
2. 为何要用
当程序中出现明细的两类任务,一类负责生产数据,一类负责处理数据
就可以引入生产者消费者模型来实现生产者与消费者的解耦合,平衡生产能力与消费能力,从提升效率
3. 如何用
from multiprocessing import Process,Queue import time,randomdef producer(name,food,p):for i in range(3):res='%s%s'%(food,i)time.sleep(random.randint(1,3))print('%s生产了%s'%(name,res))p.put(res)def customer(name,p):while True:res=p.get()if res is None:break#判断消费者是否消费完,如果消费完,就会取到NONEtime.sleep(random.randint(1,3))print('%s吃了%s'%(name,res))if __name__ == '__main__':p=Queue()p1=Process(target=producer,args=('1','葱油拌屎',p,))p2 = Process(target=producer, args=('2', '手抓屎', p,))p3 = Process(target=producer, args=('3', '飘香拌屎', p,))c1=Process(target=customer,args=('姚晓锋',p,))c2 = Process(target=customer, args=('阿飞', p,))p1.start()p2.start()p3.start()c1.start()c2.start()p1.join()p2.join()p3.join()#说明此时生产者已经生产完了p.put(None)#有几个消费者就加上几个NONE p.put(None)c1.join()c2.join()print('主')
方式一
from multiprocessing import Process,JoinableQueue import time,randomdef producer(name,food,p):for i in range(3):res='%s%s'%(food,i)time.sleep(random.randint(1,3))print('%s生产了%s'%(name,res))p.put(res)def customer(name,p):while True:res=p.get()time.sleep(random.randint(1,3))print('%s吃了%s'%(name,res))if __name__ == '__main__':p=JoinableQueue()p1=Process(target=producer,args=('1','葱油拌屎',p,))p2 = Process(target=producer, args=('2', '手抓屎', p,))p3 = Process(target=producer, args=('3', '飘香拌屎', p,))c1=Process(target=customer,args=('姚晓锋',p,))c2 = Process(target=customer, args=('阿飞', p,))c1.daemon=Truec2.daemon=Truep1.start()p2.start()p3.start()c1.start()c2.start()p1.join()p2.join()p3.join()p.join()#主进程等待队列里为空#一旦队列为空,说明消费者取完了队列,消费者没有价值了print('主')
方式二
二、线程理论
1 什么是线程
进程其实一个资源单位,而进程内的线程才是cpu上的执行单位
线程其实指的就是代码的执行过程
2 为何要用线程
线程的优点
1. 同一进程下的多个线程共享该进程内的资源
2. 创建线程的开销要远远小于进程
三、开启线程的两种方式
线程开启的方式与进程一致
from threading import Thread import timedef task(name):print('%s is running'%name)time.sleep(3)print('%s is done'%name)if __name__ == '__main__':p=Thread(target=task,args=('yxf',))p.start()print('主')
方式一
from threading import Thread import timeclass Mythread(Thread):def __init__(self,name):super().__init__()self.name=namedef run(self):print('%s is running'%self.name)time.sleep(3)print('%s is done'%self.name)if __name__ == '__main__':p=Mythread('egon')p.start()print('主')
方式二
四、线程特性介绍
Thread实例对象的方法
isAlive(): 返回线程是否活动的。
getName(): 返回线程名。
setName(): 设置线程名。
threading模块提供的一些方法
threading.currentThread(): 返回当前的线程变量。
threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果
同一进程下的线程共享资源
from threading import Thread,current_thread,active_countn=100 def task():global nn=0print('子进程n=',n,current_thread())if __name__ == '__main__':p1=Thread(target=task,)p1.start()print(active_count())p1.join()print(active_count())print('主进程n=',n,current_thread())
代码验证
五、守护线程
守护线程的生命周期取决于被守护线程(主线程)的生命周期,但是主线程要等到非守护线程都结束执行才会执行完毕
也就是说,只有非守护线程都执行完毕,守护线程才会结束
from threading import Thread import time def foo():print(123)time.sleep(1)print("end123")def bar():print(456)time.sleep(3)print("end456")if __name__ == '__main__':t1=Thread(target=foo)t2=Thread(target=bar)t1.daemon=Truet1.start()t2.start()print("main-------")
代码验证
六、线程互斥锁
与进程一致
from threading import Thread,Lock import timemutex=Lock() n=100 def task():global nmutex.acquire()temp=ntime.sleep(0.1)n=temp-1mutex.release()if __name__ == '__main__':t_l=[]for i in range(100):t=Thread(target=task)t_l.append(t)t.start()for t in t_l:t.join()print(n)
代码验证
转载于:https://www.cnblogs.com/xvchengqi/p/9599543.html
Python入门学习-DAY35-线程相关推荐
- python速成要多久2019-8-28_2019最全Python入门学习路线,不是我吹,绝对是最全
近几年Python的受欢迎程度可谓是扶摇直上,当然了学习的人也是愈来愈多.一些学习Python的小白在学习初期,总希望能够得到一份Python学习路线图,小编经过多方汇总为大家汇总了一份Python学 ...
- 自学python推荐书籍2019-2019最全Python入门学习路线,不是我吹,绝对是最全
近几年Python的受欢迎程度可谓是扶摇直上,当然了学习的人也是愈来愈多.一些学习Python的小白在学习初期,总希望能够得到一份Python学习路线图,小编经过多方汇总为大家汇总了一份Python学 ...
- python入门视频教程推荐-python入门学习哪个书比较好(python视频教程知乎)
自学python的学习路线是什么?推荐一些python学习资源 第一段 初级,掌握Python的语法和常用库的使用 这里首先推雪锋在网上的书籍,这是Python2.7的,这本书适合于重头开始一直读完, ...
- 字字谏言!Python入门学习教程:关于Python不得不说的事儿
作为程序员,你肯定遇到过这样的领导: "别人还没走,你先走了不合适吧." "不能确定功劳,总得有苦劳吧!你看别人9点谁走了?" 说到996,这很有可能是诱因之一 ...
- Python入门学习---第四天
面向对象编程 类和实例 概念与其他面向对象编程语言类似. 以Student类为例,在Python中,定义类是通过class关键字: class Student(object):pass (object ...
- Python入门学习之异常处理机制
异常即是一个事件,该事件会在程序执行过程中发生影响程序的正常执行.python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误.今天的Python入门学习课程就给大家讲解一下异常 ...
- python入门学习:4.if语句
python入门学习:4.if语句 关键点:判断 4.1 一个简单的测试4.2 条件测试4.3 if语句 4.1 一个简单的测试 if语句基本格式如下,注意不要漏了冒号 1if 条件 :2 执行1 ...
- Python入门学习指南--内附学习框架
Python入门学习指南 原文链接:https://blog.csdn.net/weixin_44558127/article/details/86527360 最近开始整理python的资料,博主建 ...
- 编程语言python怎么读-Python入门学习的计算机程序设计语言是怎样的?
原标题:Python入门学习的计算机程序设计语言是怎样的? 你可能已经听说过很多种流行编程语言,比如非常难学的C语言,非常流行的Java语言,适合初学者的Basic语言,适合网页编程的Java语言.那 ...
- 自学python买什么书比较好-python入门学习哪个书比较好(python视频教程知乎)
自学python的学习路线是什么?推荐一些python学习资源 第一段 初级,掌握Python的语法和常用库的使用 这里首先推雪锋在网上的书籍,这是Python2.7的,这本书适合于重头开始一直读完, ...
最新文章
- HadoopIO和javaIO的区别
- ubuntu下c 访问mysql_Ubuntu下用C语言访问MySQL数据库
- mongoose Topology was destroyed 处理
- mysql kill 超过1分钟的语句
- odoo 中实现多列搜索
- NI VISION视觉安装
- 教你用爬虫批量采集淘宝商品评论数据
- 微信小游戏开发指南(二)微信小游戏常见问题解答
- python开三次方_python 三次方
- WOW战斗逻辑系统分析
- 移动鼠标计算鼠标偏移量
- java horizontalbarchart_DOC-03-36 柱状图(Bar Chart)
- 【笔记】排列组合公式、二项式定理
- 安装Cloudera Manager-5.12.2 集成 CHD-5.12.2 问题总结
- 去马赛克 Demosaic
- SpringBoot控制配置类加载顺序
- vscode中使用md文件
- 串行器 MAX96717F 芯片介绍
- 万能密码HTTP基本方法 —— 【WUST-CTF2020】admin
- ViewPager控件之PagerAdapter适配器
热门文章
- hdu 4323 Magic Number dp 多校联合赛(三)第四题
- Illustrator 教程,如何在 Illustrator 中格式化文本?
- Mac新手使用技巧——设置Finder(访达)快捷键
- 如何在苹果Mac上右键点击?
- AutoCAD 2022 for Mac v2022.2.1中文版
- Inpaint for Mac(图片去水印软件)
- 如何快速将所有东西从旧的Intel Mac迁移到新的M1 MacBook
- RHEL7体验KVM虚拟机
- 【转】 pycharm快捷键、常用设置、配置管理(后两者详见原博客)
- 【转载】BitSet