Python-进程-进程池-原理
进程
资源集合,调度和分配资源,说到进程就不得不提到线程,线程和进程是密不可分,进程申请了资源,但真正使用资源的是线程,其实本质上类似面向对象的思想,面向对象把数据和数据的操作封装在一个类中,进程把资源和对资源的操作封装在进程中,其实进程本质上是对资源的封装,那就比对进程和线程的区别来认识进程:
1. 进程是资源容器,真正使用资源的是线程,进程可以申请并拥有自己独立资源但线程不能,线程只能使用进程已有的资源
2. 进程在CPU上执行体现在线程,一个进程至少有一个主线程,可以有0个或者多个子线程
3. 从粒度角度看,进程粒度远远比线程大,进程粒度比线程小,也就是切换进程消耗远比线程切换大
4. 线程是操作系统调度的最小单位,对于IO操作进程和线程差别不大,进程和线程都可以竞争CPU资源,归根到本质上是线程在竞争CPU资源
5. 进程与进程之间是资源完全隔离,也就是说不可互相访问
北门吹雪: http://www.cnblogs.com/2bjiujiu/
Python进程模块 multiprocessing
# 这个模块的接口和线程模块threading一致
多进程实例过程:
1. 实例进程
2. 启动子进程
3. 等待子进程结束
import multiprocessing def add(end, name):
total = 0
for i in range(end+1):
total += i
print(name)
return total if __name__ == '__main__':
# 实例子进程
ps = multiprocessing.Process(target=add, args=(100, "北门吹雪"), name="北门吹雪")
# 启动子进程
ps.start()
# 等待子进程结束
ps.join()
进程池 Pool
# 接口和线程池一致,可以获取进程状态,如子进程执行结果、否准备、是否执行成功、等待子进程执行完成
1. 实例进程池,需要传递进程池数量
2. 添加子进程到进程池中
3. 先关闭Pool,禁止进程池再接收任务
4. 等待进程池中进程完成
6. 关闭进程池
import multiprocessing def add(end, name, blog):
total = 0
for i in range(end+1):
total += i
print(name, total, blog)
return total if __name__ == '__main__':
# 实例子进程,和CPU数量一致
ps_pool = multiprocessing.Pool(multiprocessing.cpu_count())
# 提交任务,获得返回进程对象对象, 可在此提交多个进程
r = ps_pool.apply_async(func=add, args=(100, "北门吹雪", "https://www.cnblogs.com/2bjiujiu/"))
# 获取执行结果,状态信息
print(r.get())
# print(r.wait())
print(r.ready())
print(r.successful())
# 关闭线程池
ps_pool.close()
# 等待子线程完成
ps_pool.join()
7. 进程池获取子进程状态
执行结果 .get
是否就绪 .ready
是否执行成功 .successful
等待子进程 .wait
8. 进程池imap方法, 特点是进程函数名不变,改变的传递进去的参数,结果是进程返回的结果,有先后顺序
import multiprocessing def add(info):
end = info[0]
name = info[1]
blog = info[2]
total = 0
for i in range(end+1):
total += i
print(end, name, blog)
return total if __name__ == '__main__':
# 实例子进程,和CPU数量一致
ps_pool = multiprocessing.Pool(multiprocessing.cpu_count()) # imap方式
info = [(100, "北门吹雪", "https://www.cnblogs.com/2bjiujiu/"), (200, "北门吹雪", "https://www.cnblogs.com/2bjiujiu/")]
# imap方式
for total in ps_pool.imap(add, info):
print(total)
北_门_吹_雪:http://www.cnblogs.com/2bjiujiu/
进程之间通信机制
# 本质上是通过共享内存块实现通信
1. 多进程Queue
import multiprocessing def add(ps_queue, end, name, blog):
total = 0
for i in range(end+1):
total += i
print(name, blog)
ps_queue.put(total) if __name__ == '__main__':
# 实例队列
ps_queue = multiprocessing.Queue()
# 实例子进程
ps = multiprocessing.Process(target=add, args=(ps_queue, 100, "北门吹雪", "https://www.cnblogs.com/2bjiujiu/"), name="北门吹雪")
# 启动子进程
ps.start()
# 等待子进程结束
ps.join()
# 从Queue中取值
print(ps_queue.get())
2. 管道 Pipe,只适于两个进程中通信,性能优于Queue
import multiprocessing def add(phone_one, end, name, blog):
total = 0
for i in range(end+1):
total += i
print(name, blog)
# 发送数据,当然也可以接收
phone_one.send(total) if __name__ == '__main__':
# 实例管道, 类似打电话
phone_one, phone_two = multiprocessing.Pipe() # 实例子进程
ps = multiprocessing.Process(target=add, args=(phone_one, 100, "北门吹雪", "https://www.cnblogs.com/2bjiujiu/"), name="北门吹雪")
# 启动子进程
ps.start()
# 等待子进程结束
ps.join() # Pipe中取值
print(phone_two.recv())
3. 共享内存 Manager 包含Python基本数据结构
import multiprocessing
from multiprocessing import Manager def add(share_list, end, name, blog):
total = 0
for i in range(end+1):
total += i
print(name, blog)
# 添加数据
share_list.append(total)
share_list.append(name)
share_list.append(blog) if __name__ == '__main__':
# 实例共享内存对象
share_memory = multiprocessing.Manager()
# 实例list数据类型,当然除了list包括Python基本数据结构
share_list = share_memory.list() # 实例子进程
ps = multiprocessing.Process(target=add, args=(share_list, 100, "北门吹雪", "https://www.cnblogs.com/2bjiujiu/"), name="北门吹雪")
# 启动子进程
ps.start()
# 等待子进程结束
ps.join() # 从共享对象中取值
print(share_list)
北_门_吹_雪:http://www.cnblogs.com/2bjiujiu/
计算机资源:
1. 内存、磁盘、CPU、网卡这4个是计算机核心资源
2. 资源是稀缺的,需要竞争计算机资源
3. 进程操作系统调度分配资源的单位,每个应用至少有一个进程
4. 进程是竞争计算机资源的单位,CPU可以在不同的应用程序中切换,这个时间非常短暂,宏观上是并行,这个理念在在单核上,多核CPU可以并行执行多个进程
5. 进程调度最核心的功能,操作系统会有自己算法,决定进程是否挂起,进程和线程的切换开销非常大,将CPU资源消耗在进程和线程切换上,时间片,频繁切换和保存进程上下文消耗CPU资源
北_门_吹_雪:http://www.cnblogs.com/2bjiujiu/
经验:
1. 进程和线程都能竞争CPU资源,并且线程包含在进程中,同时存在又同时消亡(这里说主进程和主线程),进程和线程边界不清晰,这让进程和线程概念更加难以理清
2. 进程和线程在逻辑上由非常多的相似点,如实例方式、启动方式、堵塞方式、池的概念、锁的概念,线程更像缩小版进程,但不是进程,包含在进程中只能使用进程分配已经有的资源
3. 进程与进程之间资源隔离,不可互相访问,线程之间只能访问各自进程中的资源,并不是广义上的可以互相访问资源
4. 进程用面向对象的语义来说,把资源和对资源的操作封装在一个进程中
5. 进程切换消耗远大于线程,但为何还是需要进程,因为进程很像静态资源,使用静态资源效率上远比动态资源来的效率高,一般进程数量和CPU总核心数一致,但还是需要考虑安全冗余,不要把所有CPU跑满
北_门_吹_雪:http://www.cnblogs.com/2bjiujiu/
Python-进程-进程池-原理的更多相关文章
- python基础-12 多线程queue 线程交互event 线程锁 自定义线程池 进程 进程锁 进程池 进程交互数据资源共享
Python中的进程与线程 学习知识,我们不但要知其然,还是知其所以然.你做到了你就比别人NB. 我们先了解一下什么是进程和线程. 进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CP ...
- Python之进程 3 - 进程池和multiprocess.Poll
一.为什么要有进程池? 在程序实际处理问题过程中,忙时会有成千上万的任务需要被执行,闲时可能只有零星任务.那么在成千上万个任务需要被执行的时候,我们就需要去创建成千上万个进程么?首先,创建进程需要消耗 ...
- {Python之进程} 背景知识 什么是进程 进程调度 并发与并行 同步\异步\阻塞\非阻塞 进程的创建与结束 multiprocess模块 进程池和mutiprocess.Poll
Python之进程 进程 本节目录 一 背景知识 二 什么是进程 三 进程调度 四 并发与并行 五 同步\异步\阻塞\非阻塞 六 进程的创建与结束 七 multiprocess模块 八 进程池和mut ...
- python开发进程:共享数据&进程池
一,共享数据 展望未来,基于消息传递的并发编程是大势所趋 即便是使用线程,推荐做法也是将程序设计为大量独立的线程集合 通过消息队列交换数据.这样极大地减少了对使用锁定和其他同步手段的需求, 还可以扩展 ...
- python中进程池的应用
#原创,转载请联系 假设我们写的一个程序需要运行100个子进程的时候,那么写程序时,不可能循环创建销毁100个进程吧?进程的创建与销毁是很耗系统的资源的. 进程池的作用就体现出来了. 进程池可以控制进 ...
- python中进程池和回调函数
一.数据共享 1.进程间的通信应该尽量避免共享数据的方式 2.进程间的数据是独立的,可以借助队列或管道实现通信,二者都是基于消息传递的. 虽然进程间数据独立,但可以用过Manager实现数据共享,事实 ...
- Python多进程-进程池
进程池可以减轻多进程对CPU的负担 把一个进程序列放入进程池,使用的时候,就会在进程池中取进程如果进程池中没有进程了,脚本就会等待,直到进程池中有可用进程 进程池生成的子线程,不能直接运行,要放入进程 ...
- python线程,进程,队列和缓存
一.线程 threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. 创建线程的两种方式1.threading.Thread import threading def f1(arg): ...
- 5分钟看懂系列:Python 线程池原理及实现
概述 传统多线程方案会使用"即时创建, 即时销毁"的策略.尽管与创建进程相比,创建线程的时间已经大大的缩短,但是如果提交给线程的任务是执行时间较短,而且执行次数极其频繁,那么服务器 ...
- python之进程与线程
什么是操作系统 可能很多人都会说,我们平时装的windows7 windows10都是操作系统,没错,他们都是操作系统.还有没有其他的? 想想我们使用的手机,Google公司的Androi ...
随机推荐
- python_选择排序
#选择排序 def insert_sort(li): for i in range (1,len(li)): # i表示摸到牌的下标 tem = li[i] j = i - 1 # j 是初始手中的牌 ...
- opencv 截图并保存
opencv 截图并保存(转载) 代码功能:选择图像中矩形区,按S键截图并保存,Q键退出. #include<opencv2/opencv.hpp> #include<iostrea ...
- 程序员小哥教你秋招拿大厂offer
快要到秋招了,对于应届生来说,秋招是一个特别重要的机会.对于社招同学来说,金九银十也是一个很好的跳槽窗口. 而我呢,因为是从上海到广州工作,就没有提前先把工作定下来.刚好也趁这个机会出去旅游了两个月. ...
- e3mall商城的归纳总结3之后台商品节点、认识nginx
一 后台商品节点 大家都知道后台创建商品的时候需要选择商品的分类,而这个商品的分类就就像一棵树一样,一层包含一层又包含一层.因此这里用的框架是easyUiTree.该分类前端使用的是异步加载模式(指 ...
- 多商铺平台手机电脑自适应宣传展示平台店铺javassh项目代码线上
部署运行:eclipse 建议使用jdk 1.8 + ,Tomcat 8.0 + 系统介绍: 1.网站后台采用主流的 SSH框架 jsp JSTL,网站前台采用Angular jS框架 2.网站前端采 ...
- docker快速搭建php7.2-nginx开发环境
1.输入命令: docker search -s 100 php 搜索出下面图中列表,选择webdevops/php-nginx. 2.通过docker拉取webdevops/php-nginx镜像, ...
- Mono集成中使用api获取当前mono 调用堆栈的方法
// 在mono源代码层级中加如下两个api 可以获取堆栈字符串 这两个api我新加的,原来没有.基于原来的代码改的. // add by bodong#if PLATFORM_WIN32 __dec ...
- Spring整合Quartz (cronTrigger和simpleTrigger实现方法)
Spring整合Quartz (cronTrigger和simpleTrigger实现方法) 之前有记录过一次springboot整合Quartz的文章,由于偶尔一次自己使用spring需要整合Qua ...
- axure rp extension for chrome怎么用
1)打开文件(原型图)的resources文件夹>chrome文件夹>将文件axure-chrome-extension.crx拉至谷歌浏览器的扩展程序页面,点击确定添加 2)提示出错时, ...
- 20190923-09Linux磁盘分区类 000 017
df 查看磁盘空间使用情况 df: disk free 空余硬盘 1.基本语法 df 选项 (功能描述:列出文件系统的整体磁盘使用量,检查文件系统的磁盘空间占用情况) 2.选项说明 表1-32 选项 ...