Python多线程Concurrent

Python中使用concurrent执行多进程任务 多进程技术是独立于算法任务本身的一种优化技术,通过python中的concurrent库,我们可以非常容易的实现多进程的任务,用来优化已有的算法。这里我们也给出了一些多进程配置信息的参考方案,在GPU和超算相关的领域上,都能够发挥较大的用途。 阅读详情

背景

从 Python3.2 开始,标准库为我们提供了 concurrent.futures 模块,它提供了 ThreadPoolExecutor 和 ProcessPoolExecutor两个类,实现了对 threading 和 multiprocessing 的进一步抽象(这里主要关注线程池),不仅可以自动调度线程,还可以做到:

  1. 主线程可以获取某一个线程(或者任务的)的状态,以及返回值。
  2. 当一个线程完成的时候,主线程能够立即知道。
  3. 让多线程和多进程的编码接口一致。

总结:实现更容易,效率更高

ThreadPoolExecutor和ProcessPoolExecutor实现 互换很便捷,搞懂一个即可

看到 Pool 单词,我们就能想到 这是一个 池子,池子的概念 是 大小是有上限的,满足最大的数值以后就开始排队

1. 线程池ThreadPoolExecutor

使用 ThreadPoolExecutor 来实例化线程池对象。传入max_workers参数来设置线程池中最多能同时运行的线程数目。

from concurrent.futures import ThreadPoolExecutor
  
executor = ThreadPoolExecutor(max_workers=2)    # 表示在这个线程池中同时运行的线程有2个线程

2. 线程池Submit

使用 submit 函数来提交线程需要执行的任务(函数名和参数)到线程池中,并返回该任务的返回值,注意 submit() 不是阻塞的,而是立即返回,即无序返回。通过 submit 函数返回的任务句柄,能够使用 done() 方法判断任务是否结束,可以使用result() 方法获得返回值。

import concurrent.futures

executor = concurrent.futures.ThreadPoolExecutor(max_workers=2)


def func(num):
    for i in range(num):
        time.sleep(1)
    return num * num

task = executor.submit(func, i)
print(future.done())

3. 线程池Cancel

使用 cancel() 方法可以取消提交的任务,如果任务已经在线程池中运行了,就取消不了。举个例子,线程池的大小设置为2,如果只有2个任务,那么任务已经在运行了,会取消失败。如果改变线程池的大小为1,那么先提交的是task1,task2还在排队等候,这是时候就可以成功取消。

import concurrent.futures
executor = concurrent.futures.ThreadPoolExecutor(max_workers=1)

def func(num):
    for i in range(num):
        time.sleep(1)
    return num * num

task1 = executor.submit(func, i)
task2 = executor.submit(func, i)

print(task1.done())
print(task2.cancel()) # 如果到这里task1没有完成,就会取消

4. 线程池As_completed()

按照上面的逻辑如果我们在线程完之后需要一个一个判断是否完成 是非常不合理的,as_completed() 方法可以一次取出所有任务的结果。as_completed() 方法是一个生成器,在没有任务完成的时候,会阻塞,在有某个任务完成的时候,会 yield这个任务,就能执行for循环下面的语句,然后继续阻塞住,循环到所有的任务结束。从结果也可以看出,先完成的任务会先进去到as_completed。

import concurrent.futures
import time
from concurrent.futures import as_completed

from tqdm import trange

executor = concurrent.futures.ThreadPoolExecutor(max_workers=2)


def func(num):
    for i in range(num):
        time.sleep(1)
    return num * num

future = []
for i in range(8, -1, -1):
    print(i)
    start = time.time()
    future.append(executor.submit(func, i))
    print(time.time() - start)

for ft in as_completed(future):
    print(ft.done())
    print(ft.result())

5. 线程池Map

map方法和2中submit方法是一样的功能,但是区别在于map返回出来的结果顺序与输入顺序,而submit是无序的,没有阻塞操作。

summit方法中args是按参数传输的,而map方法中args是一个List传输

import concurrent.futures
import time
from concurrent.futures import as_completed

from tqdm import trange

executor = concurrent.futures.ThreadPoolExecutor(max_workers=2)


def func(num):
    for i in range(num):
        time.sleep(1)
    return num * num

for data in executor.map(func, range(8, -1, -1)):
    print(data)

输出顺序一定是 88, 77, …11顺序,
但是用submit方法会先打印出7
7…

6. 线程池Wait

wait 方法可以让主线程阻塞,直到满足设定的要求。wait 方法接收3个参数,等待的任务序列、超时时间以及等待条件。等待条件 reture_when 默认为 ALL_COMPLETED,表明要等待所有的任务都结束。可以看到运行结果中,确实是所有任务都完成了,主线程才打印出 main。等待条件还可以设置为 FIRST_COMPLETED,表示第一个任务完成就停止等待。

from concurrent.futures import ThreadPoolExecutor, wait, ALL_COMPLETED, FIRST_COMPLETED

executor = ThreadPoolExecutor(max_workers=2)
all_task = [executor.submit(get_html, (url)) for url in urls]
wait(all_task, return_when=ALL_COMPLETED)

总结:

  1. future的设计理念很棒,在线程池/进程池和携程中都存在future对象,是异步编程的核心。
  2. ThreadPoolExecutor 让线程的使用更加方便,减小了线程创建/销毁的资源损耗,无需考虑线程间的复杂同步,方便主线程与子线程的交互。
  3. 线程池的抽象程度很高,多线程和多进程的编码接口一致。

参考文章
https://blog.youkuaiyun.com/xiaoyu_wu/article/details/102820384

【Python】concurrent 欢迎来到Python并发编程的深邃世界。在本章中,我们将首先建立对并发编程的根本理解,剖析其核心概念,并在此背景下,探究库为何应运而生,以及它在Python并发生态系统中的独特地位。我们不只是学习API,而是要从最底层开始,理解其背后哲学和设计初衷。在深入之前,我们必须厘清几个经常被混淆但意义截然不同的概念:并发(Concurrency)、并行(Parallelism)和异步(Asynchrony)。它们是构建高性能、高响应度应用程序的基石。并发是指在同一时间段内处理多个任务的能力。它不意味着这些任务在物理 阅读详情

相关推荐

Python中的concurrent并发包(构建线程池和进程池)

Python中的concurrent并发包(构建线程池和进程池) 文章目录Python中的concurrent并发包(构建线程池和进程池)ThreadPoolExecutor线程池与ProcessPoolExecutor进程池对象构造方法concurrent.futures.Future类,未来结果类concurrent.futures.wait方法上下文管理 concurrent.futures...

兰枫 3846

python并发之concurrent快速入门

导读:我很笨,但是我很快——计算机之所以计算能力如此出众,不在于其有多智能,而是因为它超快的执行速度,而多核心则可以进一步成倍的提高效率。在python中,concurrent库就是用于...

小数志 5425

使用Python的concurrent.futures模块简化多线程与多进程编程

在这个示例中,我们创建了一个包含3个进程的进程池,并提交了5个CPU密集型任务到进程池中。注意,由于进程间通信的开销较大,因此进程池适合于CPU密集型任务,而不是IO密集型任务。在实际应用中,我们可以根据任务的性质和系统的资源来选择使用线程池还是进程池。由于进程之间的内存是隔离的,因此进程池特别适合于CPU密集型任务,或者需要避免全局解释器锁(GIL)的场景。在这个示例中,我们创建了一个包含3个线程的线程池,并提交了5个任务到线程池中。模块是一个相对高级的接口,它简化了多线程和多进程的创建和管理。

weixin_71166183的博客 765

Python最广为使用的并发库futures使用入门与内部原理

在使用Python处理任务时,限于单线程处理能力有限,需要将任务并行化,分散到多个线程或者是多个进程去执行。concurrent.futures就是这样一种库,它可以让用...

codehole_的博客 631

Python多线程concurrent.futures.ProcessPoolExecutor的使用方法

使用多线程可以并行处理多个文件,从而节省时间。在使用的体验上来说,我偏向于推荐使用 Python 的 concurrent.futures 模块来实现多线程处理。经过实际项目验证,在机器性能允许的情况下,文件越多,多线程处理在时间上节省约多,表现越出色。

wsq119的博客 592

保姆级教程:手把手教你用CANoe/CANalyzer读取汽车故障码(UDS 0x19服务实战)

本文提供了一份详细的CANoe/CANalyzer使用教程,指导如何通过UDS 0x19服务读取汽车故障码。从硬件配置到报文构建,再到故障码解析,手把手教你完成汽车诊断全流程,特别适合汽车电子工程师和诊断开发人员。

weixin_42524945的博客 260

python中threading和concurrent实现多线程

一、threading import requests from lxml import etree import threading THREAD_NUM = 10 # 启动十个线程 def request(url): """ 发起请求 :param url: 需要请求的url :return: """ response = requests.get(url) if response.status_code == 200:

Gscsd的博客 957

[南大ICS-PA2] 字符串处理函数和printf实现

[南大ICS-PA2] 程序、运行时环境与AM 字符串处理函数和printf实现

qq_42474104的博客 2987

python多线程多进程concurrent.futures详细总结

基本代码 import concurrent.futures def f(i): print(i) return i if __name__ == '__main__': with concurrent.futures.ProcessPoolExecutor(max_workers=4) as executor: futures = [executor....

qq_42680088的博客 5274

使用spacy规则化提取自然语言文本信息

1. 安装spacy pip install spicy spicy还需要载入文本库,使用pip的下载方式: python3 -m spacy download en_core_web_sm 但是很有可能因为网络问题下载速度非常缓慢,所以可以选择到github上去直接下载(注意和自己的spacy版本匹配):github下载链接 下载*.tar.gz文件即可。 然后切换到下载路径, pip install en_core_web_sm-3.1.0.tar.gz 2. spacy的一些基础用法 使用spa

六六六六神的博客 1819

PostgreSQL数据库全攻略:从入门到精通

本文是一份PostgreSQL数据库综合指南,涵盖安装配置、基础操作和高级管理。主要内容包括:1) PostgreSQL简介与各平台安装方法;2) 数据库基本操作,如创建数据库/表、CRUD操作、用户权限管理;3) 高级功能包括索引优化、事务控制、视图、存储过程、触发器和扩展模块;4) 数据库管理维护,涉及配置调优、备份恢复、性能监控和日常维护;5) 安全设置与高可用方案。指南提供了从入门到进阶的实用知识,强调结合官方文档进行深入学习,帮助用户高效使用这一功能强大的开源关系型数据库系统。

索大神的博客 1970

python多线程:concurrent.futures模块

一、Executor和Future concurrent.futures模块的基础是Exectuor,Executor是一个抽象类,ThreadPoolExecutor和ProcessPoolExecutor是其非常有用的两个子类。Future可以把它理解为一个在未来完成的操作,有异步编程的概念。 1.示例1 from concurrent.futures import Thr...

weixin_39247197的博客 771

用R语言实现“中断时间序列分析” --- R code for ITS

ITS方法可用于评估一项干预措施的效果,从水平改变和斜率改变两个角度来描述干预引起的变化。

franksui的博客 4029

python中使用concurrent.futures库,完成多线程任务

在这个示例中,我们创建了一个包含4个线程的线程池,并向其提交了10个任务。由于线程池的大小是4,因此最多同时会有4个任务在执行。这个库非常适合执行多线程或多进程任务,因为它会自动管理线程或进程的创建、调度和回收。库的好处是,它提供了简洁的API来管理并发执行的任务,并且自动处理线程的创建、调度和回收,从而简化了多线程编程的复杂性。我们创建了一个包含4个线程的线程池,并向其提交了这两个任务。,它接受一个整数参数,并返回一个该整数的平方。这样我们就可以在不阻塞的情况下,一旦任务完成就立即获取结果。

weixin_67244432的博客 1035

航空大数据——项目资源汇总及开源(四)

ADS-B项目开源大礼包

cyc头发还挺多的博客 4986

VTK vtkLookupTable vtkScalarBarActor 颜色条

有时需要给数据做一个 vtkScalarBarActor, 我们把显示的数据的一个 坐标系 来显示 颜色条1.以 Z 显示颜色 效果如下。

q610098308的专栏 4039

python 多线程/多进程 concurrent.futures/threading/multiprocessing

CPython 解释器所采用的一种机制,它确保同一时刻只有一个线程在执行 Python bytecode。给整个解释器加锁使得解释器多线程运行更方便,其代价则是牺牲了在多处理器上的并行性。可通过concurrent.futures中的ThreadPoolExecutor、 ProcessPoolExecutor分别实现多线程、多进程并行任务。提供了一种方便的方法,可以跨多个输入值并行化函数的执行,跨进程分配输入数据(数据并行),而 threading 模块中没有类似物的API。

驽马十驾,功在不舍;锲而不舍,金石可镂。 1418

大模型对齐的核心引擎:RLHF三阶段完整技术体系详解——从InstructGPT到ChatGPT与Claude 4.6的工程实践

RLHF从InstructGPT起步,经由ChatGPT、Claude系列的工程实践,已演变为现代大语言模型不可或缺的对齐基础设施。其三阶段流程——SFT构建基础能力基线,奖励模型将人类偏好编码为可微信号,PPO以KL约束驱动策略向偏好分布优化——构成了当代对齐技术的核心骨架。OpenAI的路线侧重于以海量人工标注和多目标奖励建模持续精细化RLHF流程,在规模与工程深度上持续推进;

nmdbbzcl的博客 1067

Python 多线程跑不快?用 concurrent.futures 指令,效率提升 3 倍

它是 Python 标准库中的一个模块,提供了高层次的接口,用于异步执行可调用对象,能够有效简化多线程和多进程的编程,显著提升程序的运行效率。在 Python 的编程世界里,多线程本应是提升程序运行效率的利器,能让程序同时处理多个任务,充分利用系统资源。print(f'ProcessPoolExecutor计算阶乘耗时:{end_time - start_time}秒')​。print(f'ThreadPoolExecutor耗时:{end_time - start_time}秒')​。

2503_92604243的博客 889

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

python多线程模块(threading、queue、concurrent.futures)学习笔记

一、多线程支持模块: _thread(不推荐使用) threading queue 二、threading模块的对象: 对象 描述 Thread 表示一个执行线程的对象 Lock 锁原语对象(互斥锁) RLock 可重入锁对象,单一线程可以获得已持有的锁(递归锁) Condition 条件变量对象,使得一个线程等待另一个线程满足特定的“条件” Event 任意数量线程等待某个事件的发生,该事件发生后所有等待该事件的线程将激活 Semaphore 为线程间共享的优先资源

紫薇泠雪的博客 2235

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

python中可异步执行的多进程、多线程模块concurrent.futures

官方文档:https://pythonhosted.org/futures/ 中文文档:https://docs.python.org/zh-cn/3/library/concurrent.futures.html 什么是concurrent.futures concurrent.futures模块为异步执行可调用函数提供了一个高级接口。 异步执行可以由使用ThreadPoolExecut...

西门大盗 捉虫专家 737

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

python tqdm 多线程_python – 使用tqdm与concurrent.futures?

您可以将tqdm包装在执行程序周围,如下所示,以跟踪进度:list(tqdm(executor.map(f,iter),total = len(iter))这是你的例子:import timeimport concurrent.futuresfrom tqdm import tqdmdef f(x):time.sleep(0.001) # to visualize the progressret...

weixin_30336531的博客 1403

Python concurrent.futures实现多进程多线程编程

Python的concurrent.futures模块可以很方便的实现多进程、多线程运行,减少了多进程带来的的同步和共享数据问题。Executor是一个抽象类,表示一个可执行的上下文。Future则代表一个将要执行的任务,并提供了一些方法来获取任务的状态和结果。ThreadPoolExecutor是Executor的一个具体实现类,它使用线程池来执行任务。

小龙在线 1317

python3多线程、多进程之concurrent.futures模块

1,嘚瑟 自打我用上了concurrent.futures模块,我就深深爱上了它,真是爱不释手(现在我每写一些python模块,都会考虑使用futures加快代码的执行速度。) 为啥?因为concurrent.futures好用又简单。 2,如何使用 网上也有许多资料解释如何使用该模块,但是确实存在很多坑,毕竟大部分都不是专家级别的,写写博客可能就是日常的笔记而已。。。但是,要是新手看到了...

manduner的博客 1291

python asyncio future 多线程_Python并发concurrent.futures和asyncio实例

说明Python标准库为我们提供了threading和multiprocessing模块编写相应的多线程/多进程代码。从Python3.2开始,标准库为我们提供了concurrent.futures模块,concurrent.futures 模块的主要特色是 ThreadPoolExecutor 和ProcessPoolExecutor 类,这两个类实现的接口能分别在不同的线程或进程中执行可调用的...

weixin_39572316的博客 173

Python异步多线程--concurrent.futures模块

最近一直在解决python的异步多线程,之前项目用的是异步框架celery,但是celery是单线程的,执行效率比较低;后来又使用了多线程threading模块的多线程,但由于GIL的存在,并不是真正的多线程;后来发现了concurrent.futures模块中的ThreadPoolExecutor,感觉还可以,大家有需要的可以参看这篇文章Python的线程池 ...

qq_31790023的博客 2062
上一篇: 多级多卡问题
下一篇: vscode docker debug python
Fighting_1997
博客等级 码龄7年 3万+粉丝 306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fighting_1997

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值