一、进程补充

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-线程相关推荐

  1. python速成要多久2019-8-28_2019最全Python入门学习路线,不是我吹,绝对是最全

    近几年Python的受欢迎程度可谓是扶摇直上,当然了学习的人也是愈来愈多.一些学习Python的小白在学习初期,总希望能够得到一份Python学习路线图,小编经过多方汇总为大家汇总了一份Python学 ...

  2. 自学python推荐书籍2019-2019最全Python入门学习路线,不是我吹,绝对是最全

    近几年Python的受欢迎程度可谓是扶摇直上,当然了学习的人也是愈来愈多.一些学习Python的小白在学习初期,总希望能够得到一份Python学习路线图,小编经过多方汇总为大家汇总了一份Python学 ...

  3. python入门视频教程推荐-python入门学习哪个书比较好(python视频教程知乎)

    自学python的学习路线是什么?推荐一些python学习资源 第一段 初级,掌握Python的语法和常用库的使用 这里首先推雪锋在网上的书籍,这是Python2.7的,这本书适合于重头开始一直读完, ...

  4. 字字谏言!Python入门学习教程:关于Python不得不说的事儿

    作为程序员,你肯定遇到过这样的领导: "别人还没走,你先走了不合适吧." "不能确定功劳,总得有苦劳吧!你看别人9点谁走了?" 说到996,这很有可能是诱因之一 ...

  5. Python入门学习---第四天

    面向对象编程 类和实例 概念与其他面向对象编程语言类似. 以Student类为例,在Python中,定义类是通过class关键字: class Student(object):pass (object ...

  6. Python入门学习之异常处理机制

    异常即是一个事件,该事件会在程序执行过程中发生影响程序的正常执行.python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误.今天的Python入门学习课程就给大家讲解一下异常 ...

  7. python入门学习:4.if语句

    python入门学习:4.if语句 关键点:判断 4.1 一个简单的测试4.2 条件测试4.3 if语句 4.1 一个简单的测试   if语句基本格式如下,注意不要漏了冒号 1if 条件 :2 执行1 ...

  8. Python入门学习指南--内附学习框架

    Python入门学习指南 原文链接:https://blog.csdn.net/weixin_44558127/article/details/86527360 最近开始整理python的资料,博主建 ...

  9. 编程语言python怎么读-Python入门学习的计算机程序设计语言是怎样的?

    原标题:Python入门学习的计算机程序设计语言是怎样的? 你可能已经听说过很多种流行编程语言,比如非常难学的C语言,非常流行的Java语言,适合初学者的Basic语言,适合网页编程的Java语言.那 ...

  10. 自学python买什么书比较好-python入门学习哪个书比较好(python视频教程知乎)

    自学python的学习路线是什么?推荐一些python学习资源 第一段 初级,掌握Python的语法和常用库的使用 这里首先推雪锋在网上的书籍,这是Python2.7的,这本书适合于重头开始一直读完, ...

最新文章

  1. HadoopIO和javaIO的区别
  2. ubuntu下c 访问mysql_Ubuntu下用C语言访问MySQL数据库
  3. mongoose Topology was destroyed 处理
  4. mysql kill 超过1分钟的语句
  5. odoo 中实现多列搜索
  6. NI VISION视觉安装
  7. 教你用爬虫批量采集淘宝商品评论数据
  8. 微信小游戏开发指南(二)微信小游戏常见问题解答
  9. python开三次方_python 三次方
  10. WOW战斗逻辑系统分析
  11. 移动鼠标计算鼠标偏移量
  12. java horizontalbarchart_DOC-03-36 柱状图(Bar Chart)
  13. 【笔记】排列组合公式、二项式定理
  14. 安装Cloudera Manager-5.12.2 集成 CHD-5.12.2 问题总结
  15. 去马赛克 Demosaic
  16. SpringBoot控制配置类加载顺序
  17. vscode中使用md文件
  18. 串行器 MAX96717F 芯片介绍
  19. 万能密码HTTP基本方法 —— 【WUST-CTF2020】admin
  20. ViewPager控件之PagerAdapter适配器

热门文章

  1. hdu 4323 Magic Number dp 多校联合赛(三)第四题
  2. Illustrator 教程,如何在 Illustrator 中格式化文本?
  3. Mac新手使用技巧——设置Finder(访达)快捷键
  4. 如何在苹果Mac上右键点击?
  5. AutoCAD 2022 for Mac v2022.2.1中文版
  6. Inpaint for Mac(图片去水印软件)
  7. 如何快速将所有东西从旧的Intel Mac迁移到新的M1 MacBook
  8. RHEL7体验KVM虚拟机
  9. 【转】 pycharm快捷键、常用设置、配置管理(后两者详见原博客)
  10. 【转载】BitSet