PYTHON中的CONCURRENT.FUTURES模块
一 : 概述
concurrent.futures模块提供了高度封装的异步调用接口
ThreadPoolExecutor:线程池,提供异步调用
ProcessPoolExecutor: 进程池,提供异步调用
两者都实现相同的接口,该接口由抽象执行器类定义。
二 : 基本方法
submit(fn, *args, **kwargs) 异步提交任务
map(func, *iterables, timeout=None, chunksize=1) 取代for循环submit的操作
shutdown(wait=True) 相当于进程池的pool.close()+pool.join()操作, wait=True,等待池内所有任务执行完毕回收完资源后才继续 , wait=False,立即返回,并不会等待池内的任务执行完毕 , 但不管wait参数为何值,整个程序都会等到所有任务执行完毕 , submit和map必须在shutdown之前.
result(timeout=None) 取得结果
add_done_callback(fn) 添加回调函数
1 #介绍
2 ProcessPoolExecutor类是一个Executor子类,它使用进程池异步执行调用。ProcessPoolExecutor使用多处理模块,这允许它绕过全局解释器锁,但也意味着只能执行和返回可拾取的对象。
3
4 class concurrent.futures.ProcessPoolExecutor(max_workers=None, mp_context=None)
5 一个Executor子类,使用最多包含max_workers进程的池异步执行调用。如果max_workers没有或没有给定,它将默认为机器上的处理器数量。如果max_workers小于或等于0,则会引发ValueError。 6
7
8 #用法
9 from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
10
11 import os,time,random
12 def task(n):
13 print('%s is runing' %os.getpid())
14 time.sleep(random.randint(1,3))
15 return n**2
16
17 if __name__ == '__main__':
18
19 executor=ProcessPoolExecutor(max_workers=3)
20
21 futures=[]
22 for i in range(11):
23 future=executor.submit(task,i)
24 futures.append(future)
25 executor.shutdown(True)
26 print('+++>')
27 for future in futures:
28 print(future.result())
29
30 ProcessPoolExecutor
#介绍
ThreadPoolExecutor是一个Executor子类,它使用线程池异步执行调用。
class concurrent.futures.ThreadPoolExecutor(max_workers=None, thread_name_prefix='')
一个Executor子类,它使用最多包含max_workers线程的池异步执行调用。 在3.5版中发生了更改:如果没有或没有指定max_workers,它将默认为机器上的处理器数量乘以5,假设ThreadPoolExecutor经常用于重叠I/O而不是CPU工作,并且Worker的数量应该高于ProcessPoolExecutor的工作人员数量。版本3.6中的新增功能:添加了thread_name_prefix参数,以允许用户控制线程。由池创建的工作线程的线程名称,以便于调试。 #用法
与ProcessPoolExecutor相同 ThreadPoolExecutor
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor import os,time,random
def task(n):
print('%s is runing' %os.getpid())
time.sleep(random.randint(1,3))
return n**2 if __name__ == '__main__': executor=ThreadPoolExecutor(max_workers=3) # for i in range(11):
# future=executor.submit(task,i) executor.map(task,range(1,12)) #map取代了for+submit map的用法
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
from multiprocessing import Pool
import requests
import json
import os def get_page(url):
print('<进程%s> get %s' %(os.getpid(),url))
respone=requests.get(url)
if respone.status_code == 200:
return {'url':url,'text':respone.text} def parse_page(res):
res=res.result()
print('<进程%s> parse %s' %(os.getpid(),res['url']))
parse_res='url:<%s> size:[%s]\n' %(res['url'],len(res['text']))
with open('db.txt','a') as f:
f.write(parse_res) if __name__ == '__main__':
urls=[
'https://www.baidu.com',
'https://www.python.org',
'https://www.openstack.org',
'https://help.github.com/',
'http://www.sina.com.cn/'
] # p=Pool(3)
# for url in urls:
# p.apply_async(get_page,args=(url,),callback=pasrse_page)
# p.close()
# p.join() p=ProcessPoolExecutor(3)
for url in urls:
p.submit(get_page,url).add_done_callback(parse_page) #parse_page拿到的是一个future对象obj,需要用obj.result()拿到结果 回调函数
转载至:https://www.cnblogs.com/DoingBe/p/9545066.html
PYTHON中的CONCURRENT.FUTURES模块的更多相关文章
- 在python中使用concurrent.futures实现进程池和线程池
#!/usr/bin/env python # -*- coding: utf-8 -*- import concurrent.futures import time number_list = [1 ...
- concurrent.futures模块(进程池&线程池)
1.线程池的概念 由于python中的GIL导致每个进程一次只能运行一个线程,在I/O密集型的操作中可以开启多线程,但是在使用多线程处理任务时候,不是线程越多越好,因为在线程切换的时候,需要切换上下文 ...
- Python之线程 3 - 信号量、事件、线程队列与concurrent.futures模块
一 信号量 二 事件 三 条件Condition 四 定时器(了解) 五 线程队列 六 标准模块-concurrent.futures 基本方法 ThreadPoolExecutor的简单使用 Pro ...
- Python并发编程之线程池/进程池--concurrent.futures模块
一.关于concurrent.futures模块 Python标准库为我们提供了threading和multiprocessing模块编写相应的多线程/多进程代码,但是当项目达到一定的规模,频繁创建/ ...
- 《转载》Python并发编程之线程池/进程池--concurrent.futures模块
本文转载自Python并发编程之线程池/进程池--concurrent.futures模块 一.关于concurrent.futures模块 Python标准库为我们提供了threading和mult ...
- Python之路(第四十六篇)多种方法实现python线程池(threadpool模块\multiprocessing.dummy模块\concurrent.futures模块)
一.线程池 很久(python2.6)之前python没有官方的线程池模块,只有第三方的threadpool模块, 之后再python2.6加入了multiprocessing.dummy 作为可以使 ...
- Python之网络编程之concurrent.futures模块
需要注意一下不能无限的开进程,不能无限的开线程最常用的就是开进程池,开线程池.其中回调函数非常重要回调函数其实可以作为一种编程思想,谁好了谁就去掉 只要你用并发,就会有锁的问题,但是你不能一直去自己加 ...
- 使用concurrent.futures模块中的线程池与进程池
使用concurrent.futures模块中的线程池与进程池 线程池与进程池 以线程池举例,系统使用多线程方式运行时,会产生大量的线程创建与销毁,创建与销毁必定会带来一定的消耗,甚至导致系统资源的崩 ...
- python之concurrent.futures模块
一.concurrent.futures模块简介 concurrent.futures 模块提供了并发执行调用的高级接口 并发可以使用threads执行,使用ThreadPoolExecutor 或 ...
- Python之concurrent.futures模块的使用
concurrent.futures的作用: 管理并发任务池.concurrent.futures模块提供了使用工作线程或进程池运行任务的接口.线程和进程池API都是一样,所以应用只做最小 ...
随机推荐
- react 高效高质量搭建后台系统 系列 —— 表格的封装
其他章节请看: react 高效高质量搭建后台系统 系列 表格 有一种页面在后台系统中比较常见:页面分上下两部分,上部分是 input.select.时间等查询项,下部分是查询项对应的表格数据.包含增 ...
- CodeSmith 简单使用和常用模板
1.简介 CodeSmith 是一种基于模板的代码生成工具,它使用类似于 ASP.NET的语法来生成任意类型的代码或文本. 2.软件布局 整体布局和visual studio系列相似,用过VS开发对此 ...
- 微软出品自动化神器【Playwright+Java】系列(九)多线程、重定向、弹出新窗口、截图、新页面、录制、页面对象模式操作
写在前面 关于Playwright系列的文章,真的很久没有写了,今天一个不小心官方API部分过完了,下面将为大家逐一演示,感兴趣的同学可以自行动手练习. API部分 多线程 直白点说就是多线程下Pla ...
- RestTemplate的调用方式、服务消费者
二:RestTemplate 通过RestTemplate可以实现不同微服务之间的调用 RestTemplate是spring框架提供的一种基于RESTful的服务组件,底层对HTTP请求及其相应进行 ...
- 安卓开发 java控制UI
创建布局管理器对象 设置背景 设置活动界面 按钮事件 按钮显示
- 【KAWAKO】MNN-将推理程序交叉编译成RK1126的可执行文件
目录 得到RK交叉编译器 将交叉编译器添加进path 对MNN进行交叉编译 对自己的工程进行交叉编译 将编译好的可执行文件和.so动态库放入板子中运行 得到RK交叉编译器 主要用到这两个,一个gcc的 ...
- Linux:grep 查找文件内容
在 Windows 中打开文件用查找功能可以查找我们想要的字符,前提是要打开文件.Linux 有一个指令不用打开文件就可以查询字符,而且支持正则表达式-- grep 指令.不仅如此,grep 还支持在 ...
- 基于Python的OpenGL 05 之坐标系统
1. 引言 本文基于Python语言,描述OpenGL的坐标系统 前置知识可参考: 基于Python的OpenGL 04 之变换 - 当时明月在曾照彩云归 - 博客园 (cnblogs.com) 笔者 ...
- java语言——跨平台原理,jre,jdk
day1 Java是一种混合的编译运行方式:编译+解释(虚拟机) java的跨平台:在虚拟机中运行(jvm) jdk:jvm,核心类库,开发工具(开发环境) jre:Java的运行环境
- 负载均衡做集群时关于的session不均衡的解决方案
从用户端来解释,就是当一个用户第一次访问被负载均衡代理到后端服务器A并登录后,服务器A上保留了用户的登录信息:当用户再次发送请求时, 根据负载均衡策略可能被代理到后端不同的服务器,例如服务器B,由于这 ...