内容回顾

  1. 基于原生socket的udp协议实现将client端发送过来的消息放到字典中
  2. 字典的key是所有客户端的地址,value是一个列表
  3. io :输入输出,
    • 输入到内存,向内存输入
    • 从内存中向外(硬盘,网络)输出
  4. 操作系统的发展史
    • 多道操作系统
    • 分时操作系统
  5. 并发和并行
    • 并发 : 多个程序在一个cpu上交替运行
    • 并行 : 在多个cpu上同时有多个程序在执行
  6. 阻塞和非阻塞
    • 指CPU是否在工作
    • 在工作 :非阻塞
    • 不在工作 :阻塞
  7. 同步和异步
    • 调一个任务,需要等待这个任务执行完并返回结果,现在的代码才能继续
    • 调一个任务,不关心这个任务是否执行是否完毕,只负责调用,余下的内容和我当前的代码时各自执行的
  8. 进程和程序
    • 运行中的程序
    • 是计算机中最小的资源分配单位
    • 多个进程之间的数据互相隔离
    • pid能够在操作系统中唯一标识一个进程
  9. 进程的三状态图 : 就绪 运行 阻塞
  10. 进程的创建和结束
  11. 进程的调度
    • 先来先服务
    • 短作业优先
    • 分时/多道
    • 多级反馈队列

减少阻塞

阻塞

  • 登录
  • input()
  • input()
  • 判断用户名密码

非阻塞

import sys
print(sys.argv)
if sys.argv[1] == 'alex' and sys.argv[2] == 'alex3714':
    print('登录成功')

Process类

import os
import time
def func(i):
    time.sleep(5)
    print(i,os.getpid())
print('主 :',os.getpid())
func(0)
func(1)
func(2)

使用Process类创建一个子进程

import os
import time
from multiprocessing import Process
def func(a,b,c):
    time.sleep(1)
    print(a,b,c,os.getpid(),os.getppid())
    * pid : processid   ppid : parent process id

Process进程类

if __name__ == '__main__':
    * windows操作系统下开启子进程子进程中的代码是通过import这种方式被导入到子进程中的
    print('主 :', os.getpid())
    Process(target=func,args=(1,2,3)).start()
    * Process(target=func).start()
    * Process(target=func).start()

几个概念

  • 子进程
  • 父进程
  • 主进程

if __name__ == '__main__'

  • func的参数怎么传递
  • func的返回值能返回到父进程中么? 不行
  • 进程之间数据隔离,所以子进程中的返回值父进程获取不到

进程中的其他几个方法

import os
import time
from multiprocessing import Process
def func(a,b,c):
    time.sleep(1)
    print(a,b,c,os.getpid(),os.getppid())

Process进程类

if __name__ == '__main__':
    p = Process(target=func,args=(1,2,3))
    p.start()   * p是一个进程操作符
    print(p.is_alive())
    p.terminate()  * 异步非阻塞
    print(p.is_alive())
    time.sleep(0.1)
    print(p.is_alive())
    print(p.name)
    print(p.pid)

如何开启多个子进程

import os
import time
from multiprocessing import Process
def func(a,b,c):
    time.sleep(1)
    print(a,b,c,os.getpid(),os.getppid())
if __name__ == '__main__':
    * Process(target=func,args=(1,2,3)).start()
    * Process(target=func,args=(2,3,4)).start()
    * Process(target=func,args=(3,4,5)).start()
    for i in  range(1,4):
        Process(target=func, args=(i, i+1, i+2)).start()

join

import time
import random
from multiprocessing import Process

def send_mail(name):
    time.sleep(random.uniform(1,3))
    print('已经给%s发送邮件完毕'%name)

if __name__ == '__main__':
    lst = ['alex','yuan','宝元','太白']
   * 阻塞等待一个子进程结束
   * p = Process(target=send_mail, args=('alex',))
   * p.start()
   * p.join()   * 阻塞,直到p对应的进程结束之后才结束阻塞
   * print('所有的信息都发送完毕了')

   * p_l = []
   * for name in lst:
   *     p = Process(target=send_mail,args=(name,))
   *     p.start()
   *     p_l.append(p)
   * for p in p_l : p.join()
   * print('所有的信息都发送完毕了')

守护进程

import time
from multiprocessing import Process
def func():
   for i in range(20):
       time.sleep(0.5)
       print('in func')

def func2():
   print('start : func2')
   time.sleep(5)
   print('end : func2')

if __name__ == '__main__':
   p = Process(target=func)
   p.daemon = True   * 表示设置p为一个守护进程
   p.start()
   p2 =Process(target=func2)
   p2.start()
   print('in main')
   time.sleep(3)
   print('finished')
   p2.join()
  • 主进程和子进程互不干扰
  • 主进程执行完毕之后程序不会结束,会等待所有的子进程结束之后才结束
  • 为什么主进程要等待子进程结束之后才结束?
    • 因为主进程要负责给子进程回收一些系统资源
  • 守护进程 :
    • 是一个子进程,守护的是主进程
    • 结束条件 : 主进程的代码结束,守护进程也结束
  • 进程
    • 主进程的代码结束,守护进程结束
    • 主进程要回收守护进程(子进程)的资源
    • 主进程等待其他所有子进程结束
    • 主进程回收所有子进程的资源

Process类的总结

  1. 开启子进程

    • tartget
    • args
    • if name == '__main__'
    • start()
  2. 其他的方法
    • 方法 :

      • terminate()
      • is_alive()
    • 属性
      • pid
      • name
  3. 开启多个子进程
  4. join
    • 阻塞等待一个子进程结束
    • 阻塞等待多个子进程结束
  5. 守护进程
    • daemon
  6. 面向对象的方式实现多进程
import os
from multiprocessing import Process
class MyProcess(Process):
    def run(self):   # 希望在子进程中执行的代码就放在run方法中
        print(os.getpid())

if __name__ == '__main__':
    for i in range(10):
        MyProcess().start()
import os
from multiprocessing import Process
class MyProcess(Process):
    def __init__(self,a,b):
        super().__init__()
        self.a = a
        self.b = b

    def run(self):   # 希望在子进程中执行的代码就放在run方法中
        print(os.getpid(),self.a,self.b)
        self.func()
if __name__ == '__main__':
    for i in range(10):
        MyProcess(1,2).start()   # 通知操作系统开进程,执行run方法
  • 明天要默写

    1. 内容回顾的概念
    2. 使用multiprocess起一个最简单的子进程,执行查看子进程的进程id
    3. 使用多进程实现socket tcp协议的并发server端(博客上有答案)

2019-04-15-day032-多进程介绍的更多相关文章

  1. PowerBI更新2019/04 - 解决方案架构 - PowerBI Solution Architecture(一图胜万字!)

    Power BI 架构图 (2019/04) 1) Power BI Desktop 是一个免费的工具.它可以用来准备和管理数据模型:包括链接各种数据:做数据清洗:定义关系:定义度量值和层级关系:应用 ...

  2. ubuntu12.04&15.04 安装lamp(12.04为主)

    ubuntu 12.04&15.04下安装lamp环境 注意:如果是ubuntu15.04下,apache2.4.10的话,直接在/etc/apache2/apache2.conf文件的后边直 ...

  3. 每日一练ACM 2019.04.13

    2019.04.13 第1002题:A+B Proble Ⅱ Problem DescriptionI have a very simple problem for you. Given two in ...

  4. Data truncation: Incorrect datetime value: 'May 15, 2019 4:15:37 PM

    因为系统在windows下测试过是正常的 windows下的jdk+ windows下安装的mysql 全部cases通过 linux下的jdk + windows下安装的mysql 新增和更新,影响 ...

  5. MyBatis 配置/注解 SQL CRUD 经典解决方案(2019.08.15持续更新)

    本文旨在记录使用各位大神的经典解决方案. 2019.08.14 更新 Mybatis saveOrUpdate SelectKey非主键的使用 MyBatis实现SaveOrUpdate mybati ...

  6. RTP、RTCP协议学习-2015.04.15

    最近做视频编解码部分,传输采用RTP协议.对学习做个记录 1.简介 实时传输协议(Real-time Transport Protocol或简写RTP)是一个网络传输协议,它是由IETF的多媒体传输工 ...

  7. 在 Ubuntu 14.04/15.04 上配置 Node JS v4.0.0

    大家好,Node.JS 4.0 发布了,这个流行的服务器端 JS 平台合并了 Node.js 和 io.js 的代码,4.0 版就是这两个项目结合的产物——现在合并为一个代码库.这次最主要的变化是 N ...

  8. ubuntu 14.04/15.10 安装基于eclipse的android app开发环境

    一开始是装了ubuntu15.10,不知道是我的x200机器太old还是iso镜像有问题,总是各种莫名的引导不起来.有时候刚刚装好的干净系统,只install了一个vim和openssh,重启,然后就 ...

  9. 最新版IntelliJ IDEA2019.1破解教程(2019.04.08更新)

    [原文链接]:https://www.tecchen.xyz/idea-crack.html 我的个人博客:https://www.tecchen.xyz,博文同步发布到博客园. 由于精力有限,对文章 ...

  10. 第十八次CSP认证游记 | 2019.12.15

    CSP认证的考试是Haogod介绍的,取得一定成绩之后能有机会参加CCSP的分赛区和全国决赛.这次来参加认证要感谢老师的奔走为我们申请学校的报销,虽然最终因为这不是比赛所以报名费和差旅费下不来,但是老 ...

随机推荐

  1. Redis学习-sorted set数据类型

    sorted set 是有序集合,它在 set 的基础上增加了一个顺序属性,这一属性在添加修 改元素的时候可以指定,每次指定后,会自动重新按新的值调整顺序. zadd key score member ...

  2. jquery简易tab切换

    切换tab 使用eq()函数 eq() 方法将匹配元素集缩减值指定 index 上的一个. //为项目 3 设置红色背景 <ul> <li>list item 1</li ...

  3. Dockerfile的HEALTHCHECK指令

    容器实例的状态虽然是up,但不能保证里面的进程一定是监控的.我门可以借助HEALTHCHECK指令来做监控状态检查 HEALTHCHECK指令有两种形式: HEALTHCHECK [OPTIONS] ...

  4. Codeforces Round #505 (Div 1 + Div 2 Combined) Solution

    从这里开始 题目列表 瞎扯 Problem A Doggo Recoloring Problem B Weakened Common Divisor Problem C Plasticine zebr ...

  5. easyUI使用datagrid-detailview.js实现二级列表嵌套

    本文为博主原创,转载请注明: 在easyUI中使用datagrid-detailview.js可快速实现二级折叠列表,示例如下: 注意事项: 原本在谷歌浏览器进行示例测试的,url请求对应的json文 ...

  6. Qt打开文件对话框同时选中多个文件或单个文件

    Qt中打开单个文件 //str_path为文件路径 QString str_path = QFileDialog::getOpenFileName(this, tr("选择转码文件" ...

  7. CTF显隐术:九连环

    题目:http://www.shiyanbar.com/ctf/2007 这个也挺基础的,需要注意的是:1.不要因为binwalk扫不出来就以为没有隐藏嵌入数据.2.千万不要暴力破解压缩包,如果是这样 ...

  8. tcp协议以及socket介绍

    壹:tcp协议:可靠传输 一: 3次握手,建立链接:4次挥手,断开链接 3次握手,建立链接:图解 ,这样双向通路就建立完成了. 在建立链接时,并没有数据传输,所以中间两部可以合在一起,也就是3次握手, ...

  9. 扩展的GM命令

    命令 说明 例子 .rl all 重载核心所有自定义数据表   .rl item 重载item_template   .backup a 备份Auth数据库   .backup c 备份Charact ...

  10. P1340 兽径管理

    传送门 思路: 题目要求每次连边都要输出最小生成树的边权和.如果在线直接套用最小生成树模板肯定会超时,考虑离线处理.记录每一插入边的时间,在所有边都插入完成后排序一遍就可以求最小生成树(按照插入时间的 ...