进程
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('主')

day34进程相关的更多相关文章

  1. linux内核数据结构--进程相关

    linux里面,有一个结构体task_struct,也叫“进程描述符”的数据结构,它包含了与进程相关的所有信息,它非常复杂,每一个字段都可能与一个功能相关,所以大部分细节不在我的研究范围之内,在这篇文 ...

  2. Linux2.6内核--VFS层中和进程相关的数据结构

          系统中的每一个进程都有自己的一组打开的文件,像根文件系统,当前工作目录,安装点等.有三个数据结构将 VFS 层和系统的进程紧密的联系在一起,它们分别是: file_struct,fs_st ...

  3. 使用 c# 调用进程相关开发

    最近在维护公司的以前项目中发现,使用到了进程相关知识.现在将此总结,以备后面查看复习. 一.进程查看器     程序在运行的时候,操作系统就会为其分配一个进程.那么进程到底是什么东西呢? 实际上,进程 ...

  4. linux服务器开发二(系统编程)--进程相关

    进程相关的概念 程序与进程 程序,是指编译好的二进制文件,在磁盘上,不占用系统资源(CPU.内存.打开的文件.设备.锁等等). 进程,是一个抽象的概念,与操作系统原理联系紧密.进程是活跃的程序,占用系 ...

  5. Linux进程相关命令使用场景

    Linux进程相关命令使用场景 在Linux系统上工作时,我们常常会碰到很多和进程相关的查询场景,今天在这里进行详细的讲解,进程相关的对象包括以下几个: 端口:Port 进程号:PId 执行文件所在路 ...

  6. 在Linux 中如何从进程相关的文件描述中恢复数据

    在Linux中误删除了某个文件,但是 ps-ef|grep 文件名 发现某个进程还在使用该文件,那么可以通 过以下方式恢复文件. 例如:创建一个简单文件/tmp/test.txt, 随便向里面写点内容 ...

  7. [OS] 进程相关知识点

    进程概念: 1.程序在执行中 2.一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程,是系统进行资源分配和调度的独立单位. 进程与程序的差别: ·进程----动态, 程序----静态 ·进程 ...

  8. 057_统计 Linux 进程相关数量信息

    #!/bin/bashrunning=0sleeping=0stoped=0zombie=0 #在 proc 目录下所有以数字开始的都是当前计算机正在运行的进程的进程 PID#每个 PID 编号的目录 ...

  9. 脚本_统计 Linux 进程相关数量信息

    #!bin/bash#作者:liusingbon#功能:统计 Linux 进程相关数量信息,running(运行的进程),sleeping(睡眠中的进程),stoped(停止的进程),zombie(僵 ...

随机推荐

  1. flask 自动切换环境

    简介: 我就是个半吊子程序员.在单位写点程序,在家也写点程序. 单位是企业网,不能上互联网,家里也没办法连上企业网,没有VPN. 主武器是我的笔记本电脑.在单位有一台淘汰的linux服务器,家里有个N ...

  2. jmeter操作练习

    1.登录: 2.用户定义变量 3.http请求默认值 这是登录里面的服务器名称或IP可以不用填(以上情况是当多个共用一个IP的时候,可以这样做) 4.配置文件下--CSV Data Set Confi ...

  3. HTML5:定位

    定位 一.介绍: position设置块级元素相对于其父块的位置和相对于它自身应该在的位置,任何使用定位的元素都会成为块级元素. 1.属性值 属性值 描述 absolute 生成绝对定位的元素,相对于 ...

  4. SIMTRACE环境搭建

    搭建simtrace环境 工具环境搭建 仅作参考,具有时效性,请以官方文档为准. 跨平台编译工具arm-elf 参考链接:https://osmocom.org/projects/baseband/w ...

  5. 一个class标签里面有多个属性时的提取标签

    <div class="uibox-con carpic-list03 border-b-solid">   #即这个标签同时满足三个class:“uibox”.“ca ...

  6. VS使用Nuget教程详解 Visual studio 安装第三方的组件库

    首先说明Nuget是什么呢?它的官方是:https://www.nuget.org/ 官方主页的介绍如下: What is NuGet? NuGet is the package manager fo ...

  7. MYSQL数据模型

    DROP TABLE IF EXISTS `sh_category`; CREATE TABLE `sh_category` ( `id` int(11) NOT NULL AUTO_INCREMEN ...

  8. Gym101889B. Buggy ICPC(打表)

    比赛链接:传送门 题目: Problem B – Buggy ICPC Author : Gabriel Poesia, Brasil Alan Curing is a famous sports p ...

  9. alpha冲刺(4/10)

    前言 队名:旅法师 作业链接 队长博客 燃尽图 会议 会议照片 会议内容 陈晓彬(组长) 今日进展: 召开会议 安排任务 博客撰写 问题困扰: pm和程序猿的交流到底应该怎么样呢,会出现,不做安排的任 ...

  10. Windows7 密码修改

    一:不用输入原密码的方式修改用户的密码 1 命令行输入命令:mmc  #进入到控制台 2 点击左上角的文件,选择添加/删除管理单元 3 选择本地用户和组管理单元,添加到本地计算机,完成,确定 4 添加 ...