基于concurrent.futures的进程池 和线程池
concurrent.futures:是关于进程池 和 线程池 的
官方文档
https://docs.python.org/dev/library/concurrent.futures.html
现讲进程池把,看文档你会发现,两种池的用法几乎是一样的
一段代码来了:
from concurrent.futures import ProcessPoolExecutor
impor time,os
def work(n):
print('%s is running'% os.getpid())
print('%s is end'% os.getpid())
return n**
if __name__ == '__main__':
p = ProcessPoolExecutor() # 默认是CPU的个数
start = time.time()
l = []
for i in range():
obj = p.submit(work,i)
l.append(obj)
p.shutdown()
print([obj.result() for obj in l])
print(time.time()-start)
欧克!在上面的代码中 有几个关键的方法和类。
ProcessPoolExecutor :看类的名字,进程池, 创建进程池的,需要注意的是ProcessPoolExecutor()括号内默认的是本机的CPU个数。
p.submit 类似与Pool的apply_async方法,给进程传值,submit(函数名,函数的参数)
obj.result() 看看这个接口的名字,多好领会,得到结果的, 这个result()上面的方法submit()得到的结果是一个对象,想要得到实际的值,obj.result()就得得到值了,
是不是很简单 p.shutdown() 这个shutdown是用来等的,谁等呢,在哪里写的就是谁等,等上面的子进程运行完,在运行下面的。 还有一个map方法 ,我们再来看段代码。
from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
import time,os
from threading import currentThread
def work(n):
print('%s is running'% currentThread().name)
time.sleep(2)
print('%s is end'% currentThread().name)
return n**2
if __name__ == '__main__':
p = ThreadPoolExecutor() # 默认的CPU的个数*5
obj = p.map(work,range(10)) # 迭代器
p.shutdown()
print(list(obj))
map方法
得到的是一个对象 obj=map(函数名,可迭代的对象)
就这么简单,跟之前的内置函数一样。
线程池中唯一不同的就是:
p = ThreadPoolExecutor() # 默认的CPU的个数*5
基于concurrent.futures的进程池 和线程池的更多相关文章
- concurrent.futures模块简单介绍(线程池,进程池)
一.基类Executor Executor类是ThreadPoolExecutor 和ProcessPoolExecutor 的基类.它为我们提供了如下方法: submit(fn, *args, ** ...
- 进程池与线程池基本使用、协程理论与实操、IO模型、前端、BS架构、HTTP协议与HTML前戏
昨日内容回顾 GIL全局解释器锁 1.在python解释器中 才有GIL的存在(只与解释器有关) 2.GIL本质上其实也是一把互斥锁(并发变串行 牺牲效率保证安全) 3.GIL的存在 是由于Cpyth ...
- concurrent.futures模块(进程池/线程池)
需要注意一下不能无限的开进程,不能无限的开线程最常用的就是开进程池,开线程池.其中回调函数非常重要回调函数其实可以作为一种编程思想,谁好了谁就去掉 只要你用并发,就会有锁的问题,但是你不能一直去自己加 ...
- python并发编程之进程池,线程池concurrent.futures
进程池与线程池 在刚开始学多进程或多线程时,我们迫不及待地基于多进程或多线程实现并发的套接字通信,然而这种实现方式的致命缺陷是:服务的开启的进程数或线程数都会随着并发的客户端数目地增多而增多, 这会对 ...
- 创建进程池与线程池concurrent.futures模块的使用
一.进程池. 当并发的任务数量远远大于计算机所能承受的范围,即无法一次性开启过多的任务数量就应该考虑去 限制进程数或线程数,从而保证服务器不会因超载而瘫痪.这时候就出现了进程池和线程池. 二.conc ...
- python系列之 - 并发编程(进程池,线程池,协程)
需要注意一下不能无限的开进程,不能无限的开线程最常用的就是开进程池,开线程池.其中回调函数非常重要回调函数其实可以作为一种编程思想,谁好了谁就去掉 只要你用并发,就会有锁的问题,但是你不能一直去自己加 ...
- 第三十八天 GIL 进程池与线程池
今日内容: 1.GIL 全局解释器锁 2.Cpython解释器并发效率验证 3.线程互斥锁和GIL对比 4.进程池与线程池 一.全局解释器锁 1.GIL:全局解释器锁 GIL本质就是一把互斥锁,是夹在 ...
- python并发编程之进程池,线程池,协程
需要注意一下不能无限的开进程,不能无限的开线程最常用的就是开进程池,开线程池.其中回调函数非常重要回调函数其实可以作为一种编程思想,谁好了谁就去掉 只要你用并发,就会有锁的问题,但是你不能一直去自己加 ...
- GIL锁、进程池与线程池
1.什么是GIL? 官方解释: ''' In CPython, the global interpreter lock, or GIL, is a mutex that prevents multip ...
随机推荐
- Python 8 - Socket编程进阶
本节内容: 1.Socket语法及相关 2.SocketServer实现多并发 Socket语法及相关 socket 概念 socket本质上就是在2台网络互通的电脑之间架设一个通道,两台 ...
- 【Git】Git常用命令
git remote -v : 查看远程仓库地址
- 小玩意--自定义log记录
之前在帮TCL运维项目时,因某些原因,决定单就经销商相关业务中摒弃经典的log4j日志,改为每日自定义生成并写入相关日志,我遂写了一个util,代码如下:p.s.实现的思路很简单,仅为每次需要记录时, ...
- Javascript - ExtJs - 事件
事件(ExtJs Event) Ext.Util.observable类 Ext.Util.observable是一个接口,为Ext组件的事件提供了支持,组件的事件不同于传统事件,所以需要有这么一套 ...
- Sql server—— for xml path简单用法(可以按照分组把相同组的列中的不同的值,像字符串一样拼接在一起显示在分组之后的列中。)
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAI8AAACWCAIAAABo2EyXAAAKeklEQVR4nO2dy27rNh7G+U7CFIrfZX
- [Kubernetes]CentOS7部署Kubernetes集群
环境介绍及安装前准备 三台机器,用于部署k8s的运行环境: 节点 ip Master 192.168.243.138 Node1 192.168.243.139 Node2 192.168.243.1 ...
- Java基础4-面向对象概述;super();this()
昨日内容回顾 java基本数据类型: byte : 一个字节,-128 ~ 127 = 256 short : 两个字节, -32768 ~ 32767 int : 四个字节, long : 八个字节 ...
- 【转】HTML
[转]HTML 一.html简介 1. 什么是 HTML? HTML 是用来描述网页的一种语言. HTML 指的是超文本标记语言 (Hyper Text Markup Language) HTML 不 ...
- JavaScript数组去重—ES6的两种方式
说明 JavaScript数组去重这个问题,经常出现在面试题中,以前也写过一篇数组去重的文章,(JavaScript 数组去重的多种方法原理详解)但感觉代码还是有点不够简单,今天和大家再说两种方法,代 ...
- VC获取操作系统位数
方法1,msdn 有相应的例子,代码贴出来给你看看 MSDN有相应Example! #include <windows.h> typedef BOOL (WINAPI *LPFN_ISWO ...