day 34 守护线程守护进程 互斥锁线程 信号量 生产者消费者

今日内容

1、守护进程vs 守护线程(*)

2、互斥锁(**)

3、信号量(**)

4、生产者消费者模型(*****)

5、GIL(什么时候用进程,什么时候用线程)(*****)

 

一、守护进程和守护线程

1、守护进程  (分出去的进程设置成守护进程)

  守护进程不能开启子进程

#守护进程
from multiprocessing import Process
import os,time,randomdef task():print("%s is running"%os.getpid())time.sleep(2)print("%s is done"%os.getpid())# p=Process(target=time.sleep,args=(3,))# p.start()if __name__=="__main__":p=Process(target=task)p.daemon=True  #1、
    p.start()print("")
守护进程
举例说明守护进程的应用场景:
假设有两个任务要干,要玩出并发的效果,使用进程的话可以让主进程
执行一个任务,然后开启一个子进程执行一个任务。

如果这两个任务毫无关系,那么就像上面这么做就可以
如果主进程的任务在执行完毕后,子进程的任务没有存在的意义了
那么该子进程应该在开启之前就被设置成守护进程
# 迷惑人的例子
# 主进程代码运行完毕,守护进程就会结束
from multiprocessing import Process
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__":p1=Process(target=foo)p2=Process(target=bar)# p1.daemon=True
    p1.start()p2.start()print("main___")# 打印该行则主进程代码结束,则守护进程p1应该被终止,# 可能会有p1任务执行的打印信息123,因为主进程打印main----时# ,p1也执行了,但是随即被终止
迷惑人的例子

  总结  :主进程运行完毕,守护进程也会随之结束

2、守护线程 

  一个进程开启了多个线程

 (1)守护线程能开启子线程

#守护线程:等到该进程内所有非守护线程都运行完才死掉
from multiprocessing import Process
from threading import Thread
import os,time,randomdef task():t=Thread(target=time.sleep,args=(3,))t.start()print("%s is running"% os.getpid())time.sleep(2)print("%s is done"%os.getpid())
if __name__=="__main__":t=Thread(target=task)t.daemon=True #1、必须在t.start()之前2:守护线程可以开启子线程
    t.start()t.join()print("")
守护线程

(2)迷惑人的例子  ————守护线程

      其中非守护线程还没有结束(开启线程的目的是为了执行完毕函数)

#迷惑人的例子:守护线程
from multiprocessing import Process
from threading import Thread
import time
def foo():print(123)time.sleep(1)print("end123")def bar():print(456)time.sleep(2)print("end456")if __name__=="__main__":t1=Thread(target=foo)t2=Thread(target=bar)t1.daemon=Truet1.start()t2.start()print("main_____")
# 123
# 456
# main_____
# end123
# end456
迷惑人的例子——守护线程

 

3、总结:

    为什么守护进程内不让开启子进程?

    主进程结束之后守护线程就会死掉(在这个进程中所有的非守护线程都运行完)

 主线程什么时候结束?

    主进程死掉(所有的线程结束后) 接着守护进程就会死掉

 二、互斥锁

1、互斥锁进程

from multiprocessing import Process,Lock
import os,time,randomdef task():print("%s print 1"%os.getpid())time.sleep(random.randint(1,3))print("%s print 2"%os.getpid())time.sleep(random.randint(1, 3))print("%s print 3" % os.getpid())if __name__=="__main__":p1=Process(target=task)p2=Process(target=task)p3=Process(target=task)p1.start()p1.join()p2.start()p2.join()p3.start()p3.join()
1、low的做法
from multiprocessing import Process,Lock
import os,time,randomdef task(mutex):mutex.acquire()print("%s print 1"%os.getpid())time.sleep(random.randint(1,3))print("%s print 2"%os.getpid())time.sleep(random.randint(1, 3))print("%s print 3" % os.getpid())mutex.release()
if __name__=="__main__":# p1=Process(target=task)# p2=Process(target=task)# p3=Process(target=task)# p1.start()# p1.join()# p2.start()# p2.join()# p3.start()# p3.join()mutex=Lock()p1 = Process(target=task,args=(mutex,))p2 = Process(target=task,args=(mutex,))p3 = Process(target=task,args=(mutex,))p1.start()p2.start()p3.start()
2、改进的互斥锁方法

2、模拟抢票的例子

from multiprocessing import Process,Lock
import json
import os,time,randomdef search():with open("db.txt",encoding="utf-8") as f:dic=json.load(f)print("%s 剩余票数%s"%(os.getpid(),dic["count"]))def get():with open("db.txt",encoding="utf-8")as read_f:dic=json.load(read_f)if dic["count"]>0:dic["count"]-=1time.sleep(random.randint(1,3))#模拟手速+网速with open("db.txt","w",encoding="utf-8")as write_f:json.dump(dic,write_f)print("%s 抢票成功"%os.getpid())def task(mutex):search()mutex.acquire()get()mutex.release()
if __name__=="__main__":# for i in range(20):#     p=Process(target=task)#     p.start()#     p.join()mutex=Lock()for i in range(20):p=Process(target=task,args=(mutex,))p.start()p.join()
模拟抢票的例子

3、线程互斥锁

# 线程互斥锁
from threading import Thread,Lock
import time
n=100
def task():global nwith mutex:temp=ntime.sleep(0.1)n=temp-1
if __name__=="__main__":mutex=Lock()t_1=[]for i in range(100):t=Thread(target=task)t_1.append(t)t.start()for t in t_1:t.join()print(n)
线程互斥锁

三、信号量(和进程池不一样)

例子:抢公共厕所(假如进去10个人,十把钥匙,结束一个就释放钥匙,然后进去一个)

1、进程的信号量:

from multiprocessing import Process,Semaphore
# from threading import Thread,Semaphore
import time,random,osdef task(sm):with sm:print("%s 上厕所"%os.getpid())time.sleep(random.randint(1,3))if __name__=="__main__":sm=Semaphore(3)for i in range(10):for i in range(10):p=Process(target=task,args=(sm,))p.start()
信号量

2、小心锁与锁之间的嵌套

(1)管道和队列都是用的内存的空间

(2)队列是基于管道加锁实现的

(3)如果对管道感兴趣就看博客   队列推荐使用

3、  进程Queue 和线程Queue 

不能直接放视频,应该直接放路径或者是链接

(1)

from multiprocessing import Queue #进程队列# import queue  #线程队列
q=Queue(3)q.put({"a":1})
q.put("xxxxx")
q.put(2)
q.put(4)print(q.get())
print(q.get())
print(q.get())
print(q.get())

(2)队列的功能————先进先出

from multiprocessing import Queue #进程队列
import queue  #线程队列
q=queue.Queue(3)
q.put({"a":1})
q.put("xxxxx")
q.put(2)
q.put(4)print(q.get())
print(q.get())
print(q.get())
print(q.get())
队列
# 优先级队列
from multiprocessing import Queue #进程队列
import queue  #线程队列
q=queue.PriorityQueue(3)
q.put((10,{"a":1}))
q.put((-1,"xxxxx"))
q.put((0,2))print(q.get())
print(q.get())
print(q.get())
# (-1, 'xxxxx')
# (0, 2)
# (10, {'a': 1})
优先级队列

(3)堆栈————后进先出

# 堆栈
from multiprocessing import Queue #进程队列
import queue  #线程队列
q=queue.LifoQueue(3)
q.put({"a":1})
q.put("xxxxx")
q.put(2)print(q.get())
print(q.get())
print(q.get())
print(q.get())
# 2
# xxxxx
# {'a': 1}
堆栈

 四、生产者和消费者模型

  模型指的概念

    生产者消费者可以实现程序的解耦  

from multiprocessing import Process,Queue
import time,random,osdef producer(q):for i in range(10):res="包子 %s"%itime.sleep((random.randint(1,3)))q.put(res)print("%s生产了%s"%(os.getpid(),res))def consumer(q):while True:res=q.get()print("%s 吃 %s"%(os.getpid(),res))time.sleep((random.randint(2,3)))if __name__=="__main__":q=Queue()p=Process(target=producer,args=(q,))c=Process(target=consumer,args=(q,))p.start()c.start()print("")from multiprocessing import Process,Queue
import time,random,os
def procducer(q):for i in range(10):res="包子%s"%itime.sleep(0.5)q.put(res)print("%s生产了%s"%(os.getpid(),res))
生产者和消费者 1

 

 线程要不要用生产者消费者模型

   也要用队列来实现

from multiprocessing import Process,Queue
import time,random,os
def procducer(q):for i in range(10):res="包子%s"%itime.sleep(0.5)q.put(res)print("%s生产了%s"%(os.getpid(),res))def consumer(q):while True:res=q.get()if res is None:breakprint("%s 吃 %s"%(os.getpid(),res))time.sleep(random.randint(2,3))if __name__=="__main__":q=Queue()p=Process(target=procducer,args=(q,))c=Process(target=consumer,args=(q,))p.start()c.start()p.join()q.put(None)print("")
生产者消费者模型

 

转载于:https://www.cnblogs.com/number1994/p/8185408.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466971.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20000W的电灯泡,真的是叼炸天

编排 | strongerHuang素材来源 | 电工电气学习1000W的灯泡有多亮? 20000W的灯泡呢?嵌入式专栏11000W灯泡一位手工帝名叫rctestflight,他认为普通白炽灯泡的能耗是LED灯8倍,他自己要做一盏最亮最亮的灯,就选择了LED灯泡…

以色列:新发明大幅提高太阳能发电效率

央视国际 [url]www.cctv.com[/url]  2007年08月22日太阳能发电是个老话题了,同时也有一个老问题,就是发电效率很低。最近,以色列科学家宣布,他们发明了一种新型的、高效太阳能发电系统,将促进太阳能在工业领域的广泛…

51单片机——I2C总线

单片机——I2C 宗旨:技术的学习是有限的,分享的精神是无限的。 UART 属于异步通信,比如电脑发送给单片机,电脑只负责把数据通过TXD 发送出来即可,接收数据是单片机自己的事情。而 I2C 属于同步通信, SCL 时…

物联网开发者被疯抢,华为做了什么?

5G时代到来,物联网技术的应用也离我们越来越近。智慧交通、智能家庭、智慧园区,越来越多的融入到我们的生活当中。所以,对于开发者而言,物联网将是未来发展的一大蓝海领域。但国内物联网人才短缺,每年人才缺口达百万之…

「网络流24题」 题目列表

「网络流24题」 题目列表 序号题目标题模型题解1飞行员配对方案问题二分图最大匹配<1>2太空飞行计划问题最大权闭合子图<2>3最小路径覆盖问题二分图最小路径覆盖<3>4魔术球问题二分图最小路径覆盖<4>5圆桌问题二分图多重匹配<5>6最长递增子序列问…

VMware 安装kali——linux

学习信息安全需要安装kali-linux,会遇到许多问题&#xff0c;如下&#xff1a; 1、版本问题 需要注意自己多用软件和电脑操作系统是否是一致版本&#xff0c;有些是可以安装但是不能运行。 2、安装过程选择错误的选项 我们创建新的虚拟机&#xff0c;这时&#xff0c;选择自定…

FreeRTOS及其应用,万字长文,基础入门

嵌入式系统不只是ARMLinux&#xff0c;不是只有安卓&#xff0c;凡是电子产品都可称为嵌入式系统。物联网行业的兴起&#xff0c;也提升了FreeRTOS市场占有率。本文就是介绍FreeRTOS基础及其应用&#xff0c;只是个人整理&#xff0c;可能存在问题&#xff0c;其目的只是简要介…

51单片机——EEPROM

单片机——E2PROM 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 24C02&#xff1a;256 个字节的 EEPROM。一般情况下&#xff0c;EEPROM 拥有 30 万到 100 万次的寿命。基于 I2C 通信协议的器件。I2C 是一个通信协议&#xff0c;它拥有严密的通信时序…

十二星座职业成功忠告

十二星座职业成功忠告<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />白羊座行船争解缆&#xff0c;成功要行先。白羊座的人一定要做第一&#xff0c;所以切忌冲动&#xff0c;最宜采取突击手法&#xff0c;促使成功&#xff01…

Sublime text3 代码格式化插件vue

同事用的windows的sublime轻量级容易上手.我们现在强制eslint规范.我们就需要安装这个格式化代码的插件"html-css-js-prettify" 使用 Sublime text 3 格式化HTML代码&#xff0c;需要安装插件&#xff0c;具体安装步骤如下&#xff1a; 1. 打开菜单 -> 首选项(Per…

从中工毕业到年薪30万,我用了2年9个月

1夜色如潮水一般淹没了这座城市。我蹲在阳台&#xff0c;问我的死党&#xff0c;你说我的第一篇文章&#xff0c;起个什么样的标题才足够吸引人&#xff0c;让人想点开看看呢&#xff1f;死党从床上的帘子里探出头来说&#xff0c;UC震惊部啊&#xff0c;屡试不爽&#xff0c;况…

51单片机——LCD1602

单片机——1602液晶 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 1、1602液晶读写时序 &#xff08;1&#xff09;、读状态 RSL&#xff0c;R/WH&#xff0c;EH。(判断忙完毕后释放总线) &#xff08;2&#xff09;、读数据 RSH&#xff0c;R/WH&a…

什么时候需要好教材和好教材是怎样的

入门的时候最需要好教材。入门之后&#xff0c;怎样提高自己心里已经有了个底&#xff0c;直到怎样去做就能提高。教材可以为我所用&#xff0c;而不是依赖于教材。这时候&#xff0c;即使是一本不太好的教材&#xff0c;也知道如何取舍&#xff0c;不会被教材左右&#xff0c;…

recovery模式下支持ADB连接和串口操作

前言Android平台下我们有时候会进入recovery下做一些操作&#xff0c;不管是通过ADB连接还是通过串口操作&#xff0c;都需要你的平台支持&#xff0c;不支持的话可以按照我们这篇文章进行修改。正文ADB连接进入recovery后&#xff0c;我通过ADB连接会有如下报错exec "/sy…

Get busy living or get busy dying

好久不看大片了&#xff0c;今天花了一些时间仔细看了一遍《肖申克的救赎》&#xff0c;应该是很仔细的看了一遍&#xff0c;这个影片真的震撼心灵&#xff0c;“Get busy living or get busy dying.”&#xff08;忙着活&#xff0c;还是忙着死&#xff09;是安迪最重要的一句…

买房这件小事

终于有时间再来讨论这个问题&#xff0c;可能因为在深圳&#xff0c;每次说这个问题时都挺热闹的。— — 为什么想买房&#xff1f;人很奇怪&#xff0c;也很自知&#xff0c;我在上学的时候从来没有过这样大胆的想法。后来突然想买房&#xff0c;一个原因是自己有钱了&#xf…

linux相关命令介绍

1&#xff0c;查看centos版本&#xff1a;cat /etc/redhat-releaseCentOS Linux release 7.3.1611 (Core) 2&#xff0c;在171服务器上登录GREENPLUM数仓&#xff1a;[rootmdw ~]# su - gpadmin ---切换到gpaadmin用户登录[gpadminmdw ~]$ psql -d create_dw_dev --登录POSTGR…

asp.NET自定义服务器控件内部细节系列教程一

如大家要转载&#xff0c;请保留本人的版权:/* *Description:asp.NET自定义服务器控件内部细节系列教程*Auther:崇崇-天真的好蓝 *MSN:chongchong2008msn.com *Dates:2007-05-20*Copyright:ChongChong2008 YiChang HuBei China */关于自定义asp.NET自定义服务器控件文章和源码示…

51单片机——DS18B20

单片机——DS18B20 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 DS18B20——温度传感器&#xff0c;单片机可以通过 1-Wire 和 DS18B20 进行通 信&#xff0c;最终将温度读出。1-Wire 总线的硬件接口很简单&#xff0c;只需要把 18B20 的数据引脚和单…

房价是不是泡沫?

日本买房这件小事记&#xff0c;我在深圳买房继上一篇文章之后&#xff0c;有人说我没有了解中国房地产的历史&#xff0c;就公然写房产的文章。确实&#xff0c;我没有去搜刮很多历史的数据和文章来佐证&#xff0c;也没有引用什么大家之谈&#xff0c;很多都是自己经历的一些…