day39 Pyhton 并发编程02
一.内容回顾
并发和并行的区别
并发
宏观上是在同时运行的
微观上是一个一个顺序执行
同一时刻只有一个cpu在工作
并行
微观上就是同时执行的
同一时刻不止有一个cpu在工作
什么是进程
一个运行中的程序就是一个进程
是计算机中最小的资源分配单位
什么是同步
程序顺序执行,多个任务之间串行执行
什么是异步
多个任务同时运行
IO操作
input 输入到内存 read load recv accept recvfrom input
output 从内存输出 write dump send connect sendto print
什么是阻塞
recv recvfrom accept
程序由于不符合某个条件或者要等待某个条件满足在某一个地方进入等待状态
什么是非租塞
sk.setblocking(Fasle) 就让这个socket模型不阻塞了
二.今日内容
multiprocessing是一个包
Process类
开启一个子进程
能不能给子进程传递一个参数
能不能有一个返回值
主进程控制子进程的同步
守护进程
另一种开启子进程的方式
Lock锁
保证数据的安全性
Semaphore 信号量
Event 事件
三.进程模块
1.开启了一个子进程就已经实现了并发: 父进程(主进程)和子进程并发(同时执行)
def son_process():
print('son start')
time.sleep(1)
print('son end') if __name__ == '__main__':
p = Process(target=son_process)
p.start()
for i in range(5):
print('主进程')
time.sleep(0.3
主进程
主进程
son start
主进程
主进程
主进程
son end
2.开启多个子进程
def son_process():
print('son start')
time.sleep(1)
print('son end') if __name__ == '__main__':
p1 = Process(target=son_process)
p1.start()
p2 = Process(target=son_process)
p2.start()
p3 = Process(target=son_process)
p3.start()
son start
son start
son start
son end
son end
son end
# 开启多个子进程(二)
def son_process():
print('son start')
time.sleep(1)
print('son end') if __name__ == '__main__':
for i in range(3):
p = Process(target=son_process)
p.start()
son start
son start
son start
son end
son end
son end
# 3.给子进程中传参数
def son_process(i):
print('son start',i)
time.sleep(1)
print('son end',i) if __name__ == '__main__':
for i in range(10):
p = Process(target=son_process,args=(i,))
p.start() # 通知操作系统 start并不意味着子进程已经开始了
# 4.主进程和子进程之间的关系
def son_process(i):
print('son start',i)
time.sleep(1)
print('son end',i) if __name__ == '__main__':
for i in range(10):
p = Process(target=son_process,args=(i,))
p.start()
print('主进程的代码执行完毕')
# 主进程会等待子进程结束之后才结束
# 父进程负责创建子进程,也负责回收子进程的资源
主进程的代码执行完毕
son start 3
son start 5
son start 4
son start 2
son start 0
son start 6
son start 7
son start 1
son start 9
son start 8
son end 3
son end 5
son end 4
son end 2
son end 0
son end 6
son end 7
son end 1
son end 9
son end 8
# 5.主进程不可以直接结束一个子进程
def son_process(i):
while True:
print('son start',i)
time.sleep(0.5)
print('son end',i) if __name__ == '__main__':
p = Process(target=son_process, args=(1,))
p.start() # 开启一个子进程,异步的
print('主进程的代码执行完毕')
print(p.is_alive()) # 子进程还活着
p.terminate() # 结束一个子进程,异步的
print(p.is_alive()) # 子进程还在活着
time.sleep(0.1)
print(p.is_alive())
# 6.进程之间数据隔离的概念
n = [100]
def sub_n():
global n # 子进程对于主进程中的全局变量的修改是不生效的
n.append(1)
print('子进程n : ',n)
if __name__ == '__main__':
p = Process(target = sub_n)
p.start()
p.join() # 阻塞 直到子进程p结束
print('主进程n : ',n)
子进程n : [100, 1]
主进程n : [100]
# 7.开启十个进程执行subn
# 主进程里的print('主进程n : ',n)这句话在十个子进程执行完毕之后才执行
n = [100]
import random
def sub_n():
global n # 子进程对于主进程中的全局变量的修改是不生效的
time.sleep(random.random())
n.append(1)
print('子进程n : ',n)
if __name__ == '__main__':
p_lst = []
for i in range(10):
p = Process(target = sub_n)
p.start()
p_lst.append(p)
for p in p_lst:p.join() # 阻塞 只有一个条件是能够让我继续执行 这个条件就是子进程结束
print('主进程n : ',n)
# 8.join的扩展
n = [100]
def sub_n():
global n # 子进程对于主进程中的全局变量的修改是不生效的
n.append(1)
print('子进程n : ',n)
time.sleep(10)
print('子进程结束') if __name__ == '__main__':
p = Process(target = sub_n)
p.start()
p.join(timeout = 5) # 如果不设置超时时间 join会阻塞直到子进程p结束
# timeout超时
# 如果设置的超时时间,那么意味着如果不足5s子进程结束了,程序结束阻塞
# 如果超过5s还没有结束,那么也结束阻塞
print('主进程n : ',n)
# p.terminate() # 也可以强制结束一个子进程
守护进程:
什么是守护进程
监控系统
每隔1min中主动汇报当前程序的状态
import time
from multiprocessing import Process
def alive():
while True:
print('连接监控程序,并且发送报活信息') def func():
'主进程中的核心代码'
while True:
print('选择的项目')
time.sleep(0.5)
print('根据用户的选择做一些事儿') if __name__ == '__main__':
p = Process(target=alive)
p.daemon = True # 设置子进程为守护进程,守护进程会随着主进程代码的结束而结束
p.start()
time.sleep(5)
p = Process(target=func)
p.start()
# 设置子进程为守护进程,守护进程会随着主进程代码的结束而结束
# 由于主进程要负责给所有的子进程收尸,所以主进程必须是最后结束,守护进程只能在主进程的代码结束之后就认为主进程结束了
# 守护进程在主进程的代码结束之后就结束了,不会等待其他子进程结束
守护进程必须等待所有的子进程结束之后才结束
import time
from multiprocessing import Process
def alive():
while True:
print('连接监控程序,并且发送报活信息')
time.sleep(0.6) def func():
'主进程中的核心代码'
while True:
print('选择的项目')
time.sleep(1)
print('根据用户的选择做一些事儿') if __name__ == '__main__':
p = Process(target=alive)
p.daemon = True # 设置子进程为守护进程,守护进程会随着主进程代码的结束而结束
p.start()
p = Process(target=func)
p.start()
p.join() # 在主进程中等待子进程结束,守护进程就可以帮助守护其他子进程了
day39 Pyhton 并发编程02的更多相关文章
- day39 Pyhton 并发编程02 后
一.开启子进程的另一种方式 import os from multiprocessing import Process class MyProcess(Process): def __init__(s ...
- 并发编程 02—— ConcurrentHashMap
Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...
- python并发编程02 /多进程、进程的创建、进程PID、join方法、进程对象属性、守护进程
python并发编程02 /多进程.进程的创建.进程PID.join方法.进程对象属性.守护进程 目录 python并发编程02 /多进程.进程的创建.进程PID.join方法.进程对象属性.守护进程 ...
- C++并发编程 02 数据共享
在<C++并发编程实战>这本书中第3章主要将的是多线程之间的数据共享同步问题.在多线程之间需要进行数据同步的主要是条件竞争. 1 std::lock_guard<std::mute ...
- python基础-并发编程02
并发编程 子进程回收的两种方式 join()让主进程等待子进程结束,并回收子进程资源,主进程再结束并回收资源 from multiprocessing import Process import ti ...
- Java并发编程(02):线程核心机制,基础概念扩展
本文源码:GitHub·点这里 || GitEE·点这里 一.线程基本机制 1.概念描述 并发编程的特点是:可以将程序划分为多个分离且独立运行的任务,通过线程来驱动这些独立的任务执行,从而提升整体的效 ...
- day38 Pyhton 并发编程
# 网络编程 # arp协议 : # 1.这是一个通过ip找mac地址的协议 # 2.由于有了socket,用户在使用网络的时候,只需要关心对方用户的ip地址就可以了 # 3.如果用户即将和这个ip进 ...
- day41 Pyhton 并发编程04
内容回顾 socket 最底层的网络通信 所有的网络通信都是基于socket 进程 什么是进程? 是操作系统的发展过程中,为了提高cpu的利用率,在操作系统同时运行多个程序的时候,为了数据的安 ...
- day43 Pyhton 并发编程06
一.内容回顾 线程 锁 为什么有了GIL之后还需要锁 多个线程同时操作全局变量还需要锁 当出现'非原子性操作',例如+= -= *= /= l.append(l) 原子性操作 a += 1 a= a ...
随机推荐
- 关于ES6的let、const那些事儿
Babel 转码器 Babel是广泛使用的一个ES6转换器,将ES6代码转换成ES5代码,从而实现在老版本的浏览器执行. let和const命令 let所声明的变量只在let命令所在的代码块内是有效的 ...
- Kubernetes中资源清单与Pod的生命周期(二)
一.资源清单 1,定义: 在k8s中一般使用yaml格式的文件来创建符合我们预期的资源,这样的yaml被称为资源清单. 使用资源清单创建Pod: kubectl apply -f nginx.yaml ...
- git注册到git管理远程仓库
注册: ① 注册github网站:地址:https://github.com/,其中sign up 是注册,sign in是登录 (如果是用QQ邮箱的话,如果觉得收不到邮箱,可能是在垃圾箱哦) ② 之 ...
- netty学习心得1
也不是系统学习,工作需求,一点点抠的,需要自己笼统学习下. 首先功能实现: serverBootstrap.group(boss, work).channel(NioServerSocketChann ...
- FreeSWITCH 处理Refer盲转时,UUI传递不对(没有将SIP 消息头Refer-To中的User-to-User传递给B-Leg)
运行环境: CentOS 7.6 FreeSWICH 1.6.18 一.问题场景: FreeSWITCH收到REFER命令后,重新发起的INVITE消息中的 "U ...
- Flutter学习六之实现一个带筛选的列表页面
上期实现了一个网络轮播图的效果,自定义了一个轮播图组件,继承自StatefulWidget,我们知道Flutter中并没有像Android中activity的概念.页面见的跳转是通过路由从一个全屏组件 ...
- win10病毒和威胁防护无法重新启动解决方法
1.检查电脑中是否安装了任何的第三方反病毒软件 (例如 360.腾讯电脑管家等)?如果有的话,麻烦您将其卸载,卸载完毕后重启设备,再看一下病毒和威胁防护能否正常启动:2.按 "Windows ...
- 【Processing-日常4】等待动画2
之前在CSDN上发表过: https://blog.csdn.net/fddxsyf123/article/details/79781034
- ElasticSearch 简单的crud查询
//数据库和es的对应关系(学习文档可以参考https://es.xiaoleilu.com/010_Intro/35_Tutorial_Aggregations.html) //如下接口调用都是使用 ...
- Actor:人生如戏全靠演技--“三维度”逻辑编程语言的设计(3)
在上一篇介绍了逻辑编程的作用,介绍了逻辑编程中的一些概念,包括逻辑程序的结构:事实.规则和问题:知识的表达方式:谓词演算.产生式规则,以及这些概念与三维度(角色+场景+时间)理论的契合关系,正式提出了 ...