一 : 概述

  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

最新文章

  1. C# 正则表达式总结
  2. window10的优缺点
  3. Linux 文件与目录管理
  4. 黑马程序员-c语言-类型强制转换
  5. ios开发--企业帐号发布
  6. 套题T2
  7. javascript操作Math对象的方法总结
  8. 炼数成金hadoop视频干货02
  9. intial-scale=1的含义
  10. Python Extension Packages下载链接
  11. iOS插件化研究之中的一个——JavaScriptCore
  12. 【JCP模式实战--ferrous-framework】ferrous前端开发框架邀您初体验
  13. mysql5.6.24的安装与简单使用
  14. CentOS初次安装基本配置
  15. 【开源程序(C++)】获取bing图片并自动设置为电脑桌面背景
  16. Java马士兵高并发编程视频学习笔记(二)
  17. json 的类型
  18. DBEntityEntry类
  19. PHP 实现自动加载
  20. springboot-thymeleaf

热门文章

  1. 记一次CVE实战挖掘记录
  2. 练习:集合元素处理(传统方式)-练习:集合元素处理(Stream方式)
  3. C# 线程同步查漏补缺
  4. Node.js学习笔记-----day05 (使用MongonDB重写学生信息管理案例)
  5. Timer的定时调度函数schedule的四种用法
  6. java画海报
  7. Kubernetes环境cert-manager部署与应用
  8. Idea 2022 springboot 3.0 druid: testWhileIdle is true, validationQuery not set
  9. windwos提权漏洞CVE-2023-21746复现(LocalPotato)
  10. JZOJ 2020.07.28【NOIP提高组】模拟