2019-04-15-day032-多进程介绍
内容回顾
- 基于原生socket的udp协议实现将client端发送过来的消息放到字典中
- 字典的key是所有客户端的地址,value是一个列表
- io :输入输出,
- 输入到内存,向内存输入
- 从内存中向外(硬盘,网络)输出
- 操作系统的发展史
- 多道操作系统
- 分时操作系统
- 并发和并行
- 并发 : 多个程序在一个cpu上交替运行
- 并行 : 在多个cpu上同时有多个程序在执行
- 阻塞和非阻塞
- 指CPU是否在工作
- 在工作 :非阻塞
- 不在工作 :阻塞
- 同步和异步
- 调一个任务,需要等待这个任务执行完并返回结果,现在的代码才能继续
- 调一个任务,不关心这个任务是否执行是否完毕,只负责调用,余下的内容和我当前的代码时各自执行的
- 进程和程序
- 运行中的程序
- 是计算机中最小的资源分配单位
- 多个进程之间的数据互相隔离
- pid能够在操作系统中唯一标识一个进程
- 进程的三状态图 : 就绪 运行 阻塞
- 进程的创建和结束
- 进程的调度
- 先来先服务
- 短作业优先
- 分时/多道
- 多级反馈队列
减少阻塞
阻塞
- 登录
- 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类的总结
- 开启子进程
- tartget
- args
- if name == '__main__'
- start()
- 其他的方法
- 方法 :
- terminate()
- is_alive()
- 属性
- pid
- name
- 方法 :
- 开启多个子进程
- join
- 阻塞等待一个子进程结束
- 阻塞等待多个子进程结束
- 守护进程
- daemon
- 面向对象的方式实现多进程
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方法
- 明天要默写
- 内容回顾的概念
- 使用multiprocess起一个最简单的子进程,执行查看子进程的进程id
- 使用多进程实现socket tcp协议的并发server端(博客上有答案)
2019-04-15-day032-多进程介绍的更多相关文章
- PowerBI更新2019/04 - 解决方案架构 - PowerBI Solution Architecture(一图胜万字!)
Power BI 架构图 (2019/04) 1) Power BI Desktop 是一个免费的工具.它可以用来准备和管理数据模型:包括链接各种数据:做数据清洗:定义关系:定义度量值和层级关系:应用 ...
- ubuntu12.04&15.04 安装lamp(12.04为主)
ubuntu 12.04&15.04下安装lamp环境 注意:如果是ubuntu15.04下,apache2.4.10的话,直接在/etc/apache2/apache2.conf文件的后边直 ...
- 每日一练ACM 2019.04.13
2019.04.13 第1002题:A+B Proble Ⅱ Problem DescriptionI have a very simple problem for you. Given two in ...
- Data truncation: Incorrect datetime value: 'May 15, 2019 4:15:37 PM
因为系统在windows下测试过是正常的 windows下的jdk+ windows下安装的mysql 全部cases通过 linux下的jdk + windows下安装的mysql 新增和更新,影响 ...
- MyBatis 配置/注解 SQL CRUD 经典解决方案(2019.08.15持续更新)
本文旨在记录使用各位大神的经典解决方案. 2019.08.14 更新 Mybatis saveOrUpdate SelectKey非主键的使用 MyBatis实现SaveOrUpdate mybati ...
- RTP、RTCP协议学习-2015.04.15
最近做视频编解码部分,传输采用RTP协议.对学习做个记录 1.简介 实时传输协议(Real-time Transport Protocol或简写RTP)是一个网络传输协议,它是由IETF的多媒体传输工 ...
- 在 Ubuntu 14.04/15.04 上配置 Node JS v4.0.0
大家好,Node.JS 4.0 发布了,这个流行的服务器端 JS 平台合并了 Node.js 和 io.js 的代码,4.0 版就是这两个项目结合的产物——现在合并为一个代码库.这次最主要的变化是 N ...
- ubuntu 14.04/15.10 安装基于eclipse的android app开发环境
一开始是装了ubuntu15.10,不知道是我的x200机器太old还是iso镜像有问题,总是各种莫名的引导不起来.有时候刚刚装好的干净系统,只install了一个vim和openssh,重启,然后就 ...
- 最新版IntelliJ IDEA2019.1破解教程(2019.04.08更新)
[原文链接]:https://www.tecchen.xyz/idea-crack.html 我的个人博客:https://www.tecchen.xyz,博文同步发布到博客园. 由于精力有限,对文章 ...
- 第十八次CSP认证游记 | 2019.12.15
CSP认证的考试是Haogod介绍的,取得一定成绩之后能有机会参加CCSP的分赛区和全国决赛.这次来参加认证要感谢老师的奔走为我们申请学校的报销,虽然最终因为这不是比赛所以报名费和差旅费下不来,但是老 ...
随机推荐
- 移动端picker插件
项目需要,要做移动端网页,比如选择出生日期什么的.可笑weui给的控件,竟然选择后的数据不准确. 于是自己写了一个. 链接: https://pan.baidu.com/s/1qY2SSxQ 密码: ...
- zabbix 乱码问题
一.乱码原因 查看cpu负载,中文乱码如下 这个问题是由于zabbix的web端没有中文字库,我们最需要把中文字库加上即可 二.解决zabbix乱码方法 2.1 上传字体文件到zabbix中 找到本地 ...
- Redis学习-list数据类型
list类型是一个链表结构,主要功能有push,pop等.而且list是一个双向链表,可以通过相关操作进行集合的头部或者尾部添加,删除元素. lpush key string 在key对应的list的 ...
- 模块 import 与from
什么是模块:就是一系列功能的集合体 模块的来源 :1内置模块 2 第三方模块 3 自定义模块 模块的格式: 1 使用python编写的.py文件 2 已被编译为共享库或DLL的C或C++扩展 ...
- sed 正则的一个小问题
有一段类似以下的文本 aabbccc test[3307]112323553-66778tp aooppx69tp ooppsg aabbccc test[3307]1127233-6674tp bo ...
- centos6.5换yum源
centos换yum源要借助wget,要先安装wget 输入yum -y install wget命令以安装wget 若安装wget失败或卡死, ctrl+z,ps -ef | grep yum,之后 ...
- Linux常用命令——文件搜索命令
Linux常用命令——文件搜索命令 Linux 以#号开头的内容都是内容描述或配置项 find 描述:文件搜索 语法:find [搜索范围] [范围条件] . 当前目录 示例:[root@local ...
- U3D外包公司—北京动点(公司性质)承接U3D、Kinect、VR虚拟现实,增强现实,体感互动,大屏互动等各类外包
unity3d外包就找动点软件承接虚拟现实项目外包 承接U3D.Kinect.VR虚拟现实,增强现实,体感互动,大屏互动等各类外包 联系请加QQ:372900288 联系电话:13911652504 ...
- 脚本可执行,但无HTML测试报告文件生成,其造成的原因是在PyCharm的执行模式错误
定义测试报告两种写法: 1)测试报告直接在本地绝对路径下生成 # 导入HTMLTestRunner模块 import HTMLTestRunner # 通过open()方法以二进制写模式('wb')打 ...
- openssl dgst(生成和验证数字签名)
openssl系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html 该伪命令是单向加密工具,用于生成文件的摘要信息,也可以进行数字签名,验证数字 ...