day34进程相关

进程
1 什么是进程
    进程指的是一个正在进行/运行的程序,进程是用来描述程序执行过程的虚拟概念
    进程vs程序
    程序:一堆代码
    进程:程序的执行的过程
    进程的概念起源于操作系统,进程是操作系统最核心的概念,操作系统其它所有的概念都是围绕进程来
    操作系统理论:
            操作系统是一个协调\管理\控制计算机硬件资源与应用软件资源的一段控制程序
            有两大功能:
                1. 将复杂的硬件操作封装成简单的接口给应用程序或者用户去使用
                2. 将多个进程对硬件的竞争变得有序
    操作系统发展史
        并发: 多个任务看起来是同时运行的
        串行:一个任务完完整整地运行完毕,才能运行下一个任务
        多道技术:(复用=>共享/共用)
            1. 空间上的复用:多个任务复用内存空间
            2. 时间上的复用:多个任务复用cpu的时间
                1. 一个任务占用cpu时间过长会被操作系统强行剥夺走cpu的执行权限:比起串行执行反而会降低效率
                2. 一个任务遇到io操作也会被操作系统强行剥夺走cpu的执行权限:比起串行执行可以提升效率
2 为何用进程
   实现并发
3 如何用进程
 开启子进程的方式一:  #调研系统类地点方式
  from multiprocessing import Process
  import time
  def task(name):
   print('%s is running' %name)
   time.sleep(3)
   print('%s is done' %name)
  # 在windows系统上,开启子进程的操作必须放到if __name__ == '__main__'的子代码中
  if __name__ == '__main__':
   p=Process(target=task,args=('egon',))   #Process(target=task,kwargs={'name':'egon'})
   p.start()   # 只是向操作系统发送了一个开启子进程的信号
   p.join() # join:让主进程在原地等待,等待子进程运行完毕,不会影响子进程的执行(****) 
   print('主') # join:让主进程等待子进程运行完毕,即主进程在原地阻塞,而不影响子进程的运行
      
 开启子进程的方式二:   #自定义类的方式
  from multiprocessing import Process
  import time
  class Myprocess(Process):
   def __init__(self,name):
    super().__init__()
    self.name=name
   def run(self):
    print('%s is running' %self.name)
    time.sleep(3)
    print('%s is done' %self.name)
  # 在windows系统上,开启子进程的操作必须放到if __name__ == '__main__'的子代码中
  if __name__ == '__main__':
   p=Myprocess('egon')          #p为进程对象
   p.start() # 只是向操作系统发送
4 进程相关其它操作
 1. 进程pid:每一个进程在操作系统内都有一个唯一的id号,称之为pid
 2.from multiprocessing import Process,current_process 
      current_process()  #当前进程的pid,相当于os.getpid().其中os.getppid():查看父进程的pid
 3. 进程对象其他相关的属性或方法
  p.terminate()  结束进程p
  p.is_alive()   查看进程p是否结束
 4.僵尸进程和孤儿进程:僵尸进程指死掉的进程. 孤儿进程:父进程死掉,子进程变成孤儿进程,此时父进程为:INIT
 5.守护进程: 本质就是一个"子进程",该"子进程"的生命周期<=被守护进程的生命周期
  p.daemon=True  #设置进程p 为守护进程
 6.互斥锁  :from multiprocessing import Process,Lock
  mutex = Lock()    #创建锁对象
  for i in range(10):
  p=Process(target=task,args=('路人%s' %i,mutex))  #创建进程时把互斥锁传进之进程中
  p.start()
  def task(name,mutex):
   search(name) #并发
   mutex.acquire()  #开始上锁
   get(name) #变成串行
   mutex.release()  #解锁
  join VS 互斥锁
        join:是将代码整体串行
        互斥锁:是将代码中的关于修改共享数据的 那一小部分代码变成串行,牺牲了效率保证数据安全
5.进程间通信(ICP机制)
 #队列=管道+锁  from multiprocessing import Queue
 q=Queue() #创建队列
 q.put(['first',]) #向队列中传入一个元素
 q.get()   #向队列中取出一个元素
 q=Queue(3) #队列中最大元素的个数
 q.put(['first',],block=True,timeout=3)  #队列已满时等待3秒,如果block=False,若队列已满直接报错
 q.get(block=True,timeout=3)  #队列为空时等待3秒,如果block=False,若队列为空直接报错
 q.put_nowait(1) #等效于q.put(1,block=False)
 q.get_nowait()) #等效于q.get(block=false)
6.生产者消费者模型(******)
 1. 什么是生产者消费者模型
  生产者:代指生产数据的任务
  消费者:代指处理数据的任务
  该模型的工作方式:
   生产生产数据传递消费者处理
   实现方式:生产者---->队列<------消费者
 2. 为何要用
  当程序中出现明细的两类任务,一类负责生产数据,一类负责处理数据
  就可以引入生产者消费者模型来实现生产者与消费者的解耦合,平衡生产能力与消费能力,从提升效率
 3. 如何用
  import time,random
  from multiprocessing import Process,Queue
  def producer(name,food,q):
   for i in range(3):
    res='%s%s' %(food,i)
    time.sleep(random.randint(1,3)) #模拟生产数据的时间
    q.put(res)
    print('厨师[%s]生产了<%s>' %(name,res))
  def consumer(name,q):
   while True:
    res=q.get()
    if res is None:break
    time.sleep(random.randint(1,3)) #模拟处理数据的时间
    print('吃货[%s]吃了<%s>' %(name,res))
  if __name__ == '__main__':
   q=Queue()
   # 生产者们
   p1=Process(target=producer,args=('小Egon','泔水',q))
   p2=Process(target=producer,args=('中Egon','屎包子',q))
   p3=Process(target=producer,args=('大Egon','腰子汤',q))
   # 消费者们
   c1=Process(target=consumer,args=('刘清正',q))
   c2=Process(target=consumer,args=('吴三江',q))
   p1.start()
   p2.start()
   p3.start()
   c1.start()
   c2.start()
   p1.join()
   p2.join()
   p3.join()
   q.put(None)
   q.put(None)
   print('主')
 4.补充了解第二种实现方式:
  import time,random
  from multiprocessing import Process,JoinableQueue  #可调用队列
  def producer(name,food,q):
   for i in range(3):
    res='%s%s' %(food,i)
    time.sleep(random.randint(1,3)) #模拟生产数据的时间
    q.put(res)
    print('厨师[%s]生产了<%s>' %(name,res))
  def consumer(name,q):
   while True:
    res=q.get()
    time.sleep(random.randint(1,3)) #模拟处理数据的时间
    print('吃货[%s]吃了<%s>' %(name,res))
    q.task_done()
  if __name__ == '__main__':
   q=JoinableQueue()  #相当与可调用的q=Queue()
   # 生产者们
   p1=Process(target=producer,args=('小Egon','泔水',q))
   p2=Process(target=producer,args=('中Egon','屎包子',q))
   p3=Process(target=producer,args=('大Egon','腰子汤',q))
   # 消费者们
   c1=Process(target=consumer,args=('刘清正',q))
   c2=Process(target=consumer,args=('吴三江',q))
   c1.daemon=True  #设定为守护进程
   c2.daemon=True  #设定为守护进程
   #运行进程
   p1.start()
   p2.start()
   p3.start()
   c1.start()
   c2.start()
   #等待生产者进程结束才继续主进程
   p1.join()
   p2.join()
   p3.join()
   q.join()  # 主进程等q结束,即q内数据被取干净了
   print('主')

转载于:https://www.cnblogs.com/wu-jia/p/9599964.html

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

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

相关文章

总结一些调试的心得,ES7243

这两天在调试一个与语音ADC芯片&#xff0c;也遇到了一些问题&#xff0c;到目前位置也解决了问题&#xff0c;所以想说一下嵌入式调试的一些心得&#xff0c;如果大家在调试设备的时候遇到问题&#xff0c;可以回头来看看这篇文章&#xff0c;可能会得到一些启发。我调试的系统…

电信无线网服务器是什么,怎样使用路由器共享电信天翼无线网络

准备工作&#xff1a;1.我们是四台笔记本共享&#xff1a;型号分别是联想thinkpad&#xff0c;联想非thinkpad&#xff0c;宏基&#xff0c;还有一台老爷dell(奔三 700MHZ 够老爷了吧?装的还是windows2000的系统)2. 路由器一台&#xff1a;腾达路由器&#xff0c;4孔的(TP-lin…

nls_lang.sh: 114: [[: not found

在ubuntu 10.10桌面版上安装oracle官网下载的oracle-xe-universal_10.2.0.1-1.0_i386.deb。 安装时需要加大swap分区的大小到1G以上&#xff0c;可以用这些命令增加dd if/dev/zero of/tmpswap bs1M count200 mkswap /tmpswap swapon /tmpswap 然后配置&#xff0c;在运行/etc/…

web存储机制localStorage和sessionStorage

https://www.cnblogs.com/yaoyuqian/p/7901052.html web存储包括两种&#xff1a;sessionStorage 和 localStorage&#xff08;都是限定在文档源级别&#xff0c;非同源文档间无法共享&#xff09; 1.sessionStorage 数据放在服务器上&#xff08;IE不支持&#xff09;严格用于…

“元宇宙” 是什么东西?

最近元宇宙的概念很火&#xff0c;所以转发一篇文章给大家看看。每当一个新东西出来的时候&#xff0c;有的人觉得这个是个好东西&#xff0c;也有人嗤之以鼻&#xff0c;觉得这个就是用来割韭菜的。就拿比特币来说&#xff0c;比特币有什么价值&#xff1f;他的价值无非就是操…

分布式系统服务器要求,浅谈分布式系统

分布式系统的由来软件系统的架构一直以来随着技术的发展和市场的需求进行着不断的演进。最初&#xff0c;各行业业务相对比较简单&#xff0c;对系统的要求也不高&#xff0c;软件系统的架构均采用单一应用架构&#xff0c;此时单台服务器即可满足系统的要求。之后&#xff0c;…

OCP Java 自测

一个朋友准备去考OCP Java认证&#xff0c;即原来的SCJP。心血来潮也想测测自己什么水平。找了本McGraw.Hill.OCP.Java.SE.6.Programmer.Practice.Exams&#xff0c;开盘就是两套自测题。14个题目&#xff0c;给了42分钟&#xff0c;按书中说法是过了8个就可以去考了。掐上秒表…

内核该怎么学?Linux进程管理工作原理(代码演示)

前言&#xff1a;Linux内核里大部分都是C语言。建议先看《Linux内核设计与实现(Linux Kernel Development)》,Robert Love&#xff0c;也就是LKD。Linux是一种动态系统&#xff0c;能够适应不断变化的计算需求。Linux计算需求的表现是以进程的通用抽象为中心的。进程可以是短期…

个人博客开通

点此链接 欢迎来访 ---by wolf96转载于:https://www.cnblogs.com/zhanlang96/p/9610864.html

如果访问云服务器上的文件,如果访问云服务器上的文件

如果访问云服务器上的文件 内容精选换一换WinSCP工具可以实现在本地与远程计算机之间安全地复制文件。与使用FTP上传代码相比&#xff0c;通过 WinSCP 可以直接使用服务器账户密码访问服务器&#xff0c;无需在服务器端做任何配置。通常本地Windows计算机将文件上传至Linux服务…

solaris下用户不能正常登录CDE界面的解决办法

使用过solaris系统的人&#xff0c;有时可能会碰到以普通用户不能正常登录CDE界面的问题&#xff0c;或者输入用户名和口令后&#xff0c;又回到登录框的现象&#xff0c;针对这些问题&#xff0c;建议按下面的步骤进行操作&#xff1a; 1.无法正常登录可能是由于CDE的不正确设…

int *p = *******a是什么鬼?

这是在朋友圈里面看到有人调侃的一个C语言题目&#xff0c;这里拿出来分享给大家看看。1我们知道int a 120; int* p &a;这样我们可以给指针p赋值。指针很多初学者学习的时候会觉得一脸懵逼&#xff0c;我们只要明白几个关键的东西&#xff0c;会让我们对指针理解更深入一…

[GO]匿名字段

package mainimport ("fmt" )type Person struct {name stringsex byteage int }type Student struct {Person //只有名字&#xff0c;没有字段&#xff0c;这里student相当于继承了person的所有字段&#xff0c;就有点像是继承了id intaddr string }func main() …

你见过的MCU最高GPIO翻转频率是多少?

大家好&#xff0c;我是痞子衡&#xff0c;是正经搞技术的痞子。今天痞子衡给大家介绍的是i.MXRT1010上的普通GPIO与高速GPIO极限翻转频率。上一篇文章 《聊聊i.MXRT1xxx上的普通GPIO与高速GPIO差异及其用法》&#xff0c;痞子衡从原理上介绍了 i.MXRT1xxx 系列里普通 GPIO 和 …

django中的admin组件之自定义组件的增删改查的完善

昨天我们将自定义列放在类我们自定义的Bookconfig配置类内&#xff0c;但是这样就写死了&#xff0c;因为当我们访问publish表的时候应该也有这样的自定义列&#xff0c;所以我们应该将我们的自定义列放在默认的配置表里面。应该怎么做&#xff1f; 当我们的自定义列挪到默认配…

“制造商和技术支持商”

1.用优化工具。 2.system32中的OEMINFO.ini和OEMLOGO.bmp文件 转载于:https://blog.51cto.com/honglingjin2011/537680

青春是一列不再回头的火车…

高中那年&#xff0c;我表姐对我说&#xff1a;“不要老想着出去打工赚钱&#xff0c;好好读书&#xff0c;将来肯定有用&#xff0c;也不要想着现在日子长得很&#xff0c;等你像我这样结婚生子后&#xff0c;一天一眨眼就过完了。”当时听了没有多大感觉&#xff0c;如今深以…

Android Service学习之AIDL, Parcelable和远程服务

AIDL的作用由于每个应用程序都运行在自己的进程空间&#xff0c;并且可以从应用程序UI运行另一个服务进程&#xff0c;而且经常会在不同的进程间传递对象。在Android平台&#xff0c;一个进程通常不能访问另一个进程的内存空间&#xff0c;所以要想对话&#xff0c;需要将对象分…

我和周立功的聊天

算起来&#xff0c;我和周工认识也有7年了&#xff0c;7年前我在中兴&#xff0c;偶然一次加了周工的微信&#xff0c;有一次年末&#xff0c;周立功在推广他们的示波器&#xff0c;广哥拉我进周立功的示波器技术支持群微信群&#xff0c;说是周工要给大家发红包。那时候&#…

Python 37 进程池与线程池 、 协程

一&#xff1a;进程池与线程池 提交任务的两种方式&#xff1a; 1、同步调用&#xff1a;提交完一个任务之后&#xff0c;就在原地等待&#xff0c;等任务完完整整地运行完毕拿到结果后&#xff0c;再执行下一行代码&#xff0c;会导致任务是串行执行 2、异步调用&#xff1a;提…