一、进程池。

当并发的任务数量远远大于计算机所能承受的范围,即无法一次性开启过多的任务数量就应该考虑去 限制进程数或线程数,从而保证服务器不会因超载而瘫痪。这时候就出现了进程池和线程池。

二、concurrent.futures模块介绍

concurrent.futures模块提供了高度封装的异步调用接口

ThreadPoolExecutor:线程池,提供异步调用

ProcessPoolExecutor:进程池,提供异步调用

Both implement the same interface, which is defined by the abstract Executor class

三、基本方法:

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):回调函数

done():判断某一个线程是否完成

cancle():取消某个任务

四、进程池代码实例——ProcessPoolExecutor

from concurrent.futures import ProcessPoolExecutor
from multiprocessing import current_process
import time def func(i):
print(f'进程 {current_process().name} 正在执行任务 {i}')
time.sleep(1)
return i**2 if __name__ == '__main__':
pool = ProcessPoolExecutor(4) # 进程池只有4个进程
lt = []
for i in range(20): # 假设执行20个任务
future = pool.submit(func,i) # func任务要做20次,4个进程负责完成这个20个任务
# print(future.result()) # 如果没有结果就一直等待拿到结果,导致了所有任务都在串行
lt.append(future)
pool.shutdown() # 默认为True,关闭了池的入口,会等待所有的任务执行完,结束阻塞,
for fu in lt:
print(fu.result()) # 等待所有的任务都执行完了,一起把返回值打印出来

五、线程池代码示例——ThreadPoolExecutor

from concurrent.futures import ThreadPoolExecutor
from threading import currentThread
import time def func(i):
print(f'线程 {currentThread().name} 正在执行任务 {i}')
time.sleep(1)
return i**2 if __name__ == '__main__':
fool = ThreadPoolExecutor(4) # 线程池里只有4个线程
lt = []
for i in range(20):
futrue = fool.submit(func,i) # func任务要做20次,4个线程负责完成这20次任务
lt.append(futrue)
fool.shutdown() # 默认为True,关闭了池的入口,会等待所有的任务执行完,结束阻塞,
for fu in lt:
print(fu.result()) # 等待所有的任务都执行完了,一起把返回值打印出来

六、回调函数add_done_callback(fn)

提交任务的两种方式:

同步: 提交了一个任务,必须等任务执行完了(拿到返回值),才能执行下一行代码

异步: 提交了一个任务,不要等执行完了,可以直接执行下一行代码。

ps:进程和线程回调方法的使用写一块了,注释掉的是进程的使用。

from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
from threading import currentThread
from multiprocessing import current_process
import time def task(i):
print(f'线程 {currentThread().name} 正在执行任务 {i}')
# print(f'进程 {current_process().name} 正在执行任务 {i}')
time.sleep(1)
return i**2 def parse(futrue):
# 处理拿到的结果
print(futrue.result()) if __name__ == '__main__':
pool = ThreadPoolExecutor(4) # 线程池里只有4个线程
# pool = ProcessPoolExecutor(4) # 进程池里只有4个进程
lt = []
for i in range(20):
futrue = pool.submit(task,i) # task任务要做20次,分别由四个进程完成这20个任务
futrue.add_done_callback(parse)
# 为当前任务绑定一个函数,在当前任务执行结束的时候会触发这个函数
# 会把futrue对象作为参数传给函数
# 这个称之为回调函数,处理完了回来就调用这个函数。

跟上面线程池里的例子相比:回调函数的作用,不需要等待所有的任务执行完才打印返回值。每执行完一个任务直接打印结果,实现一个并发的效果,效率有所提升。

创建进程池与线程池concurrent.futures模块的使用的更多相关文章

  1. 线程池、进程池(concurrent.futures模块)和协程

    一.线程池 1.concurrent.futures模块 介绍 concurrent.futures模块提供了高度封装的异步调用接口 ThreadPoolExecutor:线程池,提供异步调用 Pro ...

  2. 使用concurrent.futures模块中的线程池与进程池

    使用concurrent.futures模块中的线程池与进程池 线程池与进程池 以线程池举例,系统使用多线程方式运行时,会产生大量的线程创建与销毁,创建与销毁必定会带来一定的消耗,甚至导致系统资源的崩 ...

  3. 基于concurrent.futures的进程池 和线程池

    concurrent.futures:是关于进程池 和 线程池 的 官方文档 https://docs.python.org/dev/library/concurrent.futures.html 现 ...

  4. concurrent.futures模块(进程池/线程池)

    需要注意一下不能无限的开进程,不能无限的开线程最常用的就是开进程池,开线程池.其中回调函数非常重要回调函数其实可以作为一种编程思想,谁好了谁就去掉 只要你用并发,就会有锁的问题,但是你不能一直去自己加 ...

  5. Python并发编程之线程池/进程池--concurrent.futures模块

    一.关于concurrent.futures模块 Python标准库为我们提供了threading和multiprocessing模块编写相应的多线程/多进程代码,但是当项目达到一定的规模,频繁创建/ ...

  6. python并发编程之进程池,线程池concurrent.futures

    进程池与线程池 在刚开始学多进程或多线程时,我们迫不及待地基于多进程或多线程实现并发的套接字通信,然而这种实现方式的致命缺陷是:服务的开启的进程数或线程数都会随着并发的客户端数目地增多而增多, 这会对 ...

  7. 《转载》Python并发编程之线程池/进程池--concurrent.futures模块

    本文转载自Python并发编程之线程池/进程池--concurrent.futures模块 一.关于concurrent.futures模块 Python标准库为我们提供了threading和mult ...

  8. 使用concurrent.futures模块并发,实现进程池、线程池

    Python标准库为我们提供了threading和multiprocessing模块编写相应的异步多线程/多进程代码 从Python3.2开始,标准库为我们提供了concurrent.futures模 ...

  9. Python3【模块】concurrent.futures模块,线程池进程池

    Python标准库为我们提供了threading和multiprocessing模块编写相应的多线程/多进程代码,但是当项目达到一定的规模,频繁创建/销毁进程或者线程是非常消耗资源的,这个时候我们就要 ...

随机推荐

  1. 如何使用Python连接ldap

    如何使用Python连接ldap 好多使用ldap认证的软件都是Python的,比如superset和airflow, 好吧,他们都是airbnb家的.在配置ldap的时候可能会出现认证失败,你不知道 ...

  2. Linux 中如何查询端口被占用的情况

    Linux如何查看端口 1.lsof -i:端口号 用于查看某一端口的占用情况,比如查看8000端口使用情况,lsof -i:8000,如下图 可以看到8000端口已经被轻量级文件系统转发服务lwfs ...

  3. Nacos(一):Nacos介绍

    前言 6月份阿里开源的Nacos出了1.0.1版本,从去年7月份第一个release版本到现在一直在默默关注 官方的版本规划为:Nacos从0.8.0开始支持生产可用,1.0版本可大规模生产可用,2. ...

  4. Scrapy框架解读

    1. Scrapy组件a. 主体部分i. 引擎(Scrapy):处理整个系统的数据流处理,触发事务(框架核心)ii. 调度器(Scheduler):1) 用来接受引擎发过来的请求, 压入队列中, 并在 ...

  5. Integer 使用==判断127和超过128的数据的区别

    Integer封装类型字数据当超过一定长度后,若使用==来判断数否相等,那么判断的结果是false; Integer的范围是超过128就是false. 对于所有封装类而言,建议使用equals来进行判 ...

  6. ECMAScript---数字类型详解

    number数字类详解 整数.小数.负数.NaN都是number数字类型的 NaN:not a number ,但是它是数字类型的 isNaN:检测当前值是否 不是有效数字,返回true代表不是有效数 ...

  7. C# Memcache集群原理、客户端配置详细解析

    概述 memcache是一套开放源的分布式高速缓存系统.由服务端和客户端组成,以守护程序(监听)方式运行于一个或多个服务器中,随时会接收客户端的连接和操作.memcache主要把数据对象缓存到内存中, ...

  8. 关于web.xml配置

    整理自网上: web应用是一种可以通过Web访问的应用程序.在J2EE领域下,web应用就是遵守基于JAVA技术的一系列标准的应用程序. 最简单的web应用什么样? 2个文件夹.1个xml文件就能成为 ...

  9. CodeForces 346C Number Transformation II

    Number Transformation II 题解: 对于操作2来说, a - a % x[i] 就会到左边离a最近的x[i]的倍数. 也就是说 [ k * x[i] + 1,  (k+1)* x ...

  10. codeforces D. Mahmoud and Ehab and the binary string(二分)

    题目链接:http://codeforces.com/contest/862/submission/30696399 题解:这题一看操作数就知道是二分答案了.然后就是怎么个二分法,有两种思路第一种是找 ...