python_并发编程——进程池
1.进程池
from multiprocessing import Pool def func(n):
for i in range(10):
print(n+1) if __name__ == '__main__':
pool = Pool(3) #启动有三个进程的进程池。
#第一个参数进程要访问的代码,第二个参数必须是一个可迭代参数,规定了要执行的任务数
pool.map(func,range(100)) #100个任务
结果: 每个数打印了10次。
2.进程池和多进程的用时对比
def func(n):
for i in range(10):
print(n + 1) if __name__ == '__main__':
start = time.time()
pool = Pool(3) #启动有三个进程的进程池。
#第一个参数进程要访问的代码,第二个参数必须是一个可迭代参数,规定了要执行的任务数
pool.map(func,range(100)) #100个任务
t1 = time.time() - start start = time.time()
p_list = []
for i in range(100):
p = Process(target=func,args=(i,))
p_list.append(p)
p.start()
for p in p_list:
p.join()
t2 = time.time() - start
print(t1,t2)
结果: 进程池的用0.9,而多进程的用了17+
3.进程池的另一种实现方式
from multiprocessing import Pool
import time
import os def func(n):
print('start func{}'.format(n),os.getpid())
time.sleep(1)
print('end func{}'.format(n),os.getpid()) if __name__ == '__main__':
p = Pool(5)
for i in range(10):
# (调用的方法,传递参数(以元组的形式传递参数))
p.apply_async(func,args=(i,))
p.close() #结束进程池接收任务
p.join() #感知进程池中的任务执行结束
结果: 可以看到有任务执行完毕后,进程被新的任务利用。apply_async()方法如果想执行完,再继续执行主进程中的代码必须配合 close()方法和join()方法使用。
4.进程池的返回值
from multiprocessing import Pool
import time def func(n):
time.sleep(0.5)
return n*n #返回值 if __name__ == '__main__':
p = Pool()
for i in range(10):
res = p.apply_async(func,args=(i,)) #将返回值放到res这个对象中
print(res.get()) #get方法等待从res中获取值,但是会形成阻塞,只有get到数据时在会执行
结果: 每0.5秒打印一个值。失去了进程池的效果。
解决:
from multiprocessing import Pool
import time def func(n):
time.sleep(0.5)
return n*n #返回值 if __name__ == '__main__':
p = Pool()
res_list = [] #创建一个存储进程返回值对象的列表
for i in range(10):
res = p.apply_async(func,args=(i,)) #将返回值放到res这个对象中
res_list.append(res) #将返回值对象存放到列表中
for i in res_list:
print(i.get())
结果: 实现并发五个一组的打印子进程的返回值。
map方法接收进程池的返回值:
from multiprocessing import Pool
import time def func(n):
time.sleep(0.5)
return n*n #返回值 if __name__ == '__main__':
p = Pool(5)
ret = p.map(func,range(10))
print(ret)
结果:,将进程池的全部返回值存放在列表中,然后一次性打印列表。
5.进程池的回调函数
from multiprocessing import Pool
import os def func1(n):
print('函数1',os.getpid())
return n*n
def func2(nn):
print('回调函数2',os.getpid())
print(nn)
if __name__ == '__main__':
print('主进程:',os.getpid())
p = Pool(5)
p.apply_async(func1,args=(10,),callback=func2) #子进程要执行的函数 传的值 回调函数
p.close()
p.join()
结果: 回调函数会接收 上面函数1的返回值,从打印的进程号可以看出,回调函数是在主进程中执行的。
python_并发编程——进程池的更多相关文章
- python系列之 - 并发编程(进程池,线程池,协程)
需要注意一下不能无限的开进程,不能无限的开线程最常用的就是开进程池,开线程池.其中回调函数非常重要回调函数其实可以作为一种编程思想,谁好了谁就去掉 只要你用并发,就会有锁的问题,但是你不能一直去自己加 ...
- (并发编程)进程池线程池--提交任务2种方式+(异步回调)、协程--yield关键字 greenlet ,gevent模块
一:进程池与线程池(同步,异步+回调函数)先造个池子,然后放任务为什么要用“池”:池子使用来限制并发的任务数目,限制我们的计算机在一个自己可承受的范围内去并发地执行任务池子内什么时候装进程:并发的任务 ...
- python并发编程-进程池线程池-协程-I/O模型-04
目录 进程池线程池的使用***** 进程池/线程池的创建和提交回调 验证复用池子里的线程或进程 异步回调机制 通过闭包给回调函数添加额外参数(扩展) 协程*** 概念回顾(协程这里再理一下) 如何实现 ...
- python 并发编程 进程池与线程池
一 进程池与线程池 1.为什么需要进程池和线程池 基于多进程或多线程实现并发的套接字通信,然而这种实现方式的致命缺陷是: 服务端的程序运行在一台机器身上,一台机器性能是有极限的,不能无限开线程 服务的 ...
- Python并发编程-进程池的返回值
同步或异步获取返回值 #p = Pool() #p.map(funcname,iterable) 默认异步的执行任务,且自带close,join功能 #p.apply(), 同步调用进程池的方法 #p ...
- Python并发编程-进程池及异步方式
进程池的基本概念 为什么有进程池的概念 效率问题 每次开启进程,都需要开启属于这个进程的内存空间 寄存器,堆栈 进程过多,操作系统的调度 进程池 python中的 先创建一个属于进程的池子 这个池子指 ...
- Python并发编程-进程池回调函数
回调函数不能传参数 回调函数是在主进程中执行的 from multiprocessing import Pool import os def func1(n): print('in func1', o ...
- 网络编程并发 多进程 进程池,互斥锁,信号量,IO模型
进程:程序正在执行的过程,就是一个正在执行的任务,而负责执行任务的就是cpu 操作系统:操作系统就是一个协调.管理和控制计算机硬件资源和软件资源的控制程序. 操作系统的作用: 1:隐藏丑陋复杂的硬件接 ...
- python语法基础-并发编程-进程-进程池以及回调函数
############### 进程池 ############## """ 进程池的概念 为什么会有进程池? 1,因为每次开启一个进程,都需要创建一个内存空间 ...
随机推荐
- 泛微E-cology OA /weaver/ 代码执行漏洞
泛微E-cology OA /weaver/代码执行漏洞 泛微e-cology OA Beanshell组件远程代码执行 分析文章:https://dwz.cn/bYtnsKwa http://127 ...
- Java面试 - static 修饰的变量和方法有哪些特点?
1.static修饰的变量和方法,在类加载时即被初始化,可直接通过类名.变量名和类型.方法名进行调用. 2.static修饰的变量,在类加载时会被分配到数据区的方法区.类的实例可共享方法区中的变量.如 ...
- C#中使用HttpClient来Post数据的内容HttpContent的各种格式
平时使用各种网络传输的时候基本上是以Json格式进行的, 所以对其他几种格式也是一知半解, 今天静下心对其好好梳理一番. 首先我借鉴了一篇文章(https://segmentfault.com/a/1 ...
- MAVEN(二)
1.本地仓库?Maven到底有哪些仓库?它们什么关系? Maven仓库: 本地仓库路径配置: 包查找路径:本地——>私服——>中央仓库,然后将查找到的jar同步到私服——>本地仓库 ...
- Jenkins+maven+gitlab自动化部署之基础环境部署(一)
从一个二线城市,来到上海,刚入职,老大就给任务,为了减少开发打包部署时间,需要搭建一套自动化部署环境.接到任务后,赶紧上网查找资料,以及了解jenkins作用等等,用了一周时间,了解了个大概,由于都是 ...
- NationalInstruments project
//using NationalInstruments.NI4882; //请将项目文件中的"AutoGenerateBindingRedirects"属性设置为true //ht ...
- MongoDB查询操作
按条件查询 比较操作:$lt,$lte,$gt,$gte,$ne db.user.find({}}); $or :包含多个条件,他们之间为or的关系 ,$nor相当于or取反 db.user.find ...
- dg环境连接ORA-00604,ORA-16000: database open for read-only access
报错信息 根据客户提供的报错信息, ORA-: error occurred at recursive SQL level ORA-: database open for read-only acce ...
- 在论坛中出现的比较难的sql问题:7(子查询 判断某个字段的值是否连续)
原文:在论坛中出现的比较难的sql问题:7(子查询 判断某个字段的值是否连续) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以 ...
- 取代Ajax.BeginForm的ajax使用方法
原文:取代Ajax.BeginForm的ajax使用方法 一.前提概要 Asp.net core中已经取消了Ajax.BeginForm,也不会计划出ajax tag helper,所以得利用插件jq ...