python 内置模块 concurrent.futures异步编程库,线程池、进程池

news/2025/2/13 6:11:30/
一、简介

concurrent.futures是重要的异步编程库。内部实现机制非常复杂,简单来说就是开辟一个固定大小为n的进程池/线程池。进程池中最多执行n个进程/线程,当任务完成后,从任务队列中取新任务,若池满,则排队等待
concurrent.futures主要实现了进程池和线程池,适合做派生一堆任务,异步执行完成后,再收集这些任务,且保持相同的api,池的引入带来了一定好处:
开发更快,代码简洁,调调函数
进程线程复用,减去了大量开辟,删除进程线程时的开销
有效避免了因为创建进程线程过多,而导致负荷过大的问题

二、进程、线程通用方法
  1. wait(fs, timeout=None, return_when=ALL_COMPLETED),等待线程或进程执行完,再执行主线程,像当于join
  • fs: 表示需要执行的序列
  • timeout: 等待的最大时间,如果超过这个时间即使线程未执行完成也将返回
  • return_when:表示wait返回结果的条件,默认为 ALL_COMPLETED 等待全部子线程执行完
    '''
    FIRST_COMPLETED = 'FIRST_COMPLETED' 等待第一个子线程执行完成
    FIRST_EXCEPTION = 'FIRST_EXCEPTION' 第一个子线程异常
    ALL_COMPLETED = 'ALL_COMPLETED' 等待全部子线程执行完
    '''from concurrent.futures import wait,ALL_COMPLETED,FIRST_COMPLETEDwait([t1,t2],return_when=ALL_COMPLETED)
    
  1. as_completed(fs, timeout=None) 获取每一个线程或进程的返回结果,返回结果顺应为线程执行完毕的顺序
  • fs: 表示需要执行的序列
  • timeout: 等待的最大时间,如果超过这个时间即使线程未执行完成也将返回
    from concurrent.futures import as_completedfor future in as_completed([t1,t2]):print(future.result())
    
  1. Future() 创建Future对象,与协程中的asyncio.Future对象没有任何关系,submit返回的就是该对象
  • future.set_result(result):设置future返回值
  • future.result():获取future返回值
  • future.done():future是否执行完毕
  • future.cancelled():future是否取消
  • future.add_done_callback(futureCallback):执行完毕的回调函数
  • future.remove_done_callback(futureCallback):移除执行完毕的回调函数
  • future.cancel():取消future
  • future.get_loop():返回future所绑定的事件循环
  • future.set_exception(exception):设置future异常
  • future.exception():获取异常
    from concurrent.futures import Futurefuture = Future()future.set_result('future')
    print(future.result())
    
三、线程池
import time
from concurrent.futures import ThreadPoolExecutordef thread1(text):print('thread1')time.sleep(3)print(text)return f'我是{text}'def thread2(text):print('thread2')time.sleep(5)print(text)return f'我是{text}'# 创建一个最大容纳数量为2的线程池 
pool= ThreadPoolExecutor(max_workers=2)# submit提交执行的函数到线程池中
t1 = pool.submit(thread1, 'thread1_sleep')
t2 = pool.submit(thread2, 'thread2_sleep')#result来获取返回值
print(t1.result())
print(t2.result())print('主线程结束')# 线程池关闭
pool.shutdown()//优化
with ThreadPoolExecutor(max_workers=2) as pool:task1 = pool.submit(thread1, 'thread1_sleep')task2 = pool.submit(thread2, 'thread2_sleep')print(task1.result())print(task2.result())print('主线程结束')
  1. pool.submit(fn) 提交一个任务到线程池,fn:线程执行的函数,返回Future对象
  2. pool.map(fn, *iterables, timeout=None),map 方法是对序列中每一个元素都执行任务,不需要执行submit;返回顺序为线程执行顺序,fn: 程执行的函数、timeout:等待的最大时间,如果超过这个时间即使线程未执行完成也将返回、iterables二个参数接受一个可迭代对象
    import time
    from concurrent.futures import ThreadPoolExecutordef thread1(text):time.sleep(3)print(text)return f'我是{text}'pool= ThreadPoolExecutor(max_workers=2)future_list = ['thread1_sleep','thread2_sleep']map_future = pool.map(thread1,future_list)for future in map_future:print(future)print('主线程结束')
    pool.shutdown()
    
  3. pool.shutdown() 线程池关闭
四、进程池
import time
from concurrent.futures import ProcessPoolExecutor,as_completeddef task(text):print(f'{text}开始运行')time.sleep(3)print(f'{text}运行结束')return f'我是{text}'if __name__ == '__main__':pool = ProcessPoolExecutor(max_workers=3)task1 = pool.submit(task,'tak1')task2 = pool.submit(task,'tak2')print(task1.result())print(task2.result())for future in as_completed([task1, task2]):print('as_completed:',future.result())task_list = ['tal3','tak4']task_map = pool.map(task,task_list)for task_item in task_map:print(task_item)pool.shutdown()
  1. pool.submit(fn) 提交一个任务到进程池,fn 进程执行的函数,返回Future对象
  2. pool.map(fn, *iterables, timeout=None),map 方法是对序列中每一个元素都执行任务,不需要执行submit;返回顺序为进程执行顺序,fn: 进程执行的函数、timeout: 等待的最大时间,如果超过这个时间即使进程未执行完成也将返回、iterables:第二个参数接受一个可迭代对象
  3. pool.shutdown() 关闭进程池并销毁资源

http://www.ppmy.cn/news/92682.html

相关文章

ReentrantLock 和 synchronized 关键字有什么区别?

ReentrantLock 和 synchronized 关键字有什么区别? 在 Java 中,有两种常用的锁机制:ReentrantLock 和 synchronized 关键字。它们都可以用来实现线程同步,但在具体的使用上有一些区别。本文将介绍 ReentrantLock 和 synchronized…

大型软件外包开发管理工具

大型软件项目涉及人员多,软件代码量大,业务复杂,因此需要借助软件工程的管理工具进行管理,否则容易隐入混乱。今天和大家分享这些工具,这些工具比较实用,在实际工作中使用广泛,希望对大家有所帮…

C++ 基本的7种数据类型和4种类型转(C++复习向p3)

文章目录 基本内置类型存储范围typedef 声明新名字enum 枚举类型类型转换 基本内置类型 boolcharintfloatdoublevoidwchar_t ⇒ short int 存储范围 可以这样 sizeof(int) 来确认 int 占用字节数 char,1字节,-128~127 或 0~255 wchar_t,2…

课时七—进程同步(一)

1、同步与互斥的基本概念 1)临界资源 (1)临界资源:是一次仅允许一个进程使用的共享资源。各进程采取互斥的方式,实现共享的资源称作临界资源。属于临界资源的硬件有,打印机,磁带机等;软件有消息…

2022中国大学生程序设计竞赛(CCPC)高职专场

一,期望 题意: 初始时你有1−n这n个正整数和一个空的序列,你准备玩一个往序列中加数字的无聊游戏。游戏进行n轮,在游戏的每一轮中你要向序列尾部加入一个还未被加入的数,最终的序列将会是一个长度为n的排列。在某一轮游戏开始前…

【PWN · IntegerOverflow ret2text】[BJDCTF 2020]babystack2.0

第一次遇见整数溢出的题目,值得记录一下(虽然这里的整数溢出很简单 目录 前言 一、整数溢出 二、解题思路 1.ELF/checksec查看保护 2.IDA反汇编 3.整数溢出 4.exp编写 总结 前言 整数溢出漏洞——对于有/无符号数,长/短位宽转换时机…

GitLab 目录遍历漏洞复现(CVE-2023-2825)

0x01 产品简介 Gitlab是目前被广泛使用的基于git的开源代码管理平台, 基于Ruby on Rails构建, 主要针对软件开发过程中产生的代码和文档进行管理,同时可以搭建Web服务。 0x02 漏洞概述 GitLab 存在目录遍历漏洞,当嵌套在至少五个组中的公共项目中存在附…

2024王道数据结构考研丨第一章:绪论

2024王道数据结构考研笔记专栏将持续更新,欢迎 点此 收藏,共同交流学习… 文章目录 第一章:绪论1.1数据结构的基本概念1.2数据结构的三要素1.3算法的基本概念1.4算法的时间复杂度1.5算法的空间复杂度 第一章:绪论 1.1数据结构的基…