(7)Pool进程池
(1)# 开启过多的进程并不一定提高你的效率
因为进程池可以实现并行的概念,比Process单核并发的速度要快
# 如果cpu负载任务过多,平均单个任务执行的效率就会低,反而降低执行速度.
1个人做4件事和4个人做4件事
显然后者执行速度更快,
前者是并发,后者是并行
利用进程池,可以开启cpu的并行效果
# apply 开启进程,同步阻塞,每次都要等待当前任务完成之后,在开启下一个
进程,apply是同步阻塞,每个进程必须执行完,才能在开启进程;
# apply_async 开启进程,异步非阻塞,(主进程 和 子进程异步)
注意:进程池不需要start来开启
(2)语法:from threading import Thread,Pool
注意:不用写target
p.apply(函数名,args=(参数)) 有返回值
p.apply_async(函数名=(参数)) 有返回值,是一个[对象.get()]获取
os.cpu_count() 获取cpu核心数
p = Pool(6)
(3)注意;两个要一起用
# 关闭进程池,用户不能在向这个池中创建子进程
p.close()
# 这里加阻塞,直到进程池中所有的子进程执行完毕
p.join()
# (1) 比较pool 和Process 执行速度
'''因为进程池可以实现并行的概念,比Process单核并发的速度要快'''
'''
import os,time
from multiprocessing import Pool,Process def func(num):
print("发了第%s封邮件" % (num)) if __name__ == "__main__":
# print(os.cpu_count()) # 获取cpu核心数量
start = time.time()
p = Pool(6) # 6核心
for i in range(100):
# apply_async 用来开启子进程
p.apply_async(func,args=(i,)) # 关闭进程池,用户不能在向这个池中创建子进程
p.close()
# 这里加阻塞,直到进程池中所有的子进程执行完毕
p.join()
end = time.time()
print(end-start) # 单核Process处理100件任务
start = time.time()
lst = []
for i in range(100):
p = Process(target=func,args= ( i ,))
p.start()
lst.append(p)
for p in lst:
p.join()
end = time.time()
print(end-start)
# 运行完,会发现,并行比单核并发快很多
(4) 进程池.map (与高阶函数map使用方法一样,只不过这个是并发版本)
import os
from multiprocessing import Process def task(num): time.sleep(1) print("%s:%s"%(num,os.getpid())) #获取子线程号 return num ** 2 if __name__ == "__main__": p = Pool() res = p.map(task,range(20)) #自动close和join print(res) 结果[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361]
(7)Pool进程池的更多相关文章
- 运用pool进程池启动大量子进程
# Pool进程池类 from multiprocessing import Pool import os import time import random def run(index): prin ...
- 0704 Process继承实现多进程、Pool进程池,进程间通过队列通信,Pool实现多进程实现复制文件
通过继承的方式,实现Process多进程 from multiprocessing import Process import time class MyNewProcess(Process): de ...
- 多进程-Pool进程池
from multiprocessing import Pool import os,time def Foo(i): time.sleep(2) print("in process&quo ...
- 结合Pool进程池进程,实现进程之间的通讯,稍微复杂的运用
#进程池中的Queue """ 如果要用Pool创建进程,就需要multiprocessing.Manager()中的Queue() 而不是multiprocessing ...
- 进程同步控制(锁,信号量,事件), 进程通讯(队列和管道,生产者消费者模型) 数据共享(进程池和mutiprocess.Pool模块)
参考博客 https://www.cnblogs.com/xiao987334176/p/9025072.html#autoid-1-1-0 进程同步(multiprocess.Lock.Semaph ...
- python学习笔记——multiprocessing 多进程组件 进程池Pool
1 进程池Pool基本概述 在使用Python进行系统管理时,特别是同时操作多个文件目录或者远程控制多台主机,并行操作可以节约大量时间,如果操作的对象数目不大时,还可以直接适用Process类动态生成 ...
- Python 之并发编程之manager与进程池pool
一.manager 常用的数据类型:dict list 能够实现进程之间的数据共享 进程之间如果同时修改一个数据,会导致数据冲突,因为并发的特征,导致数据更新不同步. def work(dic, lo ...
- 线程池、进程池(concurrent.futures模块)和协程
一.线程池 1.concurrent.futures模块 介绍 concurrent.futures模块提供了高度封装的异步调用接口 ThreadPoolExecutor:线程池,提供异步调用 Pro ...
- 2019-04-19-day036-协程与进程池
内容回顾 11:30 码云 :王老师检查作业+定期抽查 注册账号 考试的时间 threading.enumerate(),能够获取到当前正在运行的所有线程对象列表 守护线程 守护线程会等待所有的非守护 ...
随机推荐
- spring boot 结合Redis 实现工具类
自己整理了 spring boot 结合 Redis 的工具类引入依赖 <dependency> <groupId>org.springframework.boot</g ...
- vector.resize 与 vector.reserve的区别(转载)
转载:https://blog.csdn.net/shuilan0066/article/details/3588478 reserve是容器预留空间,但并不真正创建元素对象,在创建对象之前,不能引用 ...
- linux --- 4. 虚拟环境
一.虚拟环境的两种安装方式 1. virtualenv 虚拟环境 ①下载 virtualenv pip3 install -i https://pypi.tuna.tsinghua.edu.cn/s ...
- MSYS2 更换国内源
转自 : http://www.cnblogs.com/findumars/p/6546088.html 最近一段时间不知怎么的,使用默认的 MSYS2 源升级软件或是安装新软件的特别的慢.所以就翻了 ...
- ZOJ 3963 Heap Partition(multiset + stl自带二分 + 贪心)题解
题意:给你n个数字s1~sn,要你把它们组成一棵棵二叉树,对这棵二叉树来说,所有节点来自S,并且父节点si<=子节点sj,并且i<j,问你树最少几棵二叉数.树 思路:贪心.我们往multi ...
- 为静态博客生成器WDTP移植了一款美美哒主题
前言 关于这个主题的移植后公布,我已经联系了主题作者并取得同意,这个主题是一夜涕所写的Sgreen,预览图见下 关于WDTP 就是一个很方便很便携很快速的cpp编写的带gui跨平台的开源的静态博客生成 ...
- Nuget CsvHelper 的使用
CsvHelper:nuget地址 csv导出类||生成类 public class CSVHeader { public string head1 { get; set; } public stri ...
- pyqt5 eric6 pyqt5-tools
他们都可以通过pip安装,pyqt5-tool提供了qtdesigner,
- 2、zabbix工作原理及安装配置
Zabbix架构:zabbix基本术语.zabbix安装.配置和应用 Zabbix架构中的组件: zabbix-server:C语言 zabbix-server和zabbix-agent通过 ...
- Ubuntu16.04更新记
大概一周前因为不可抗因素,我再次安装了Ubuntu16.04LTS 对于之前发誓不想再用Ubuntu的我,我只想说一句:真香 写一点我现在Ubuntu的配置,方面自己以后查看,也方便如果有相同需求的人 ...