首页 > 编程语言 >Python并发 :ThreadPoolExecutor

Python并发 :ThreadPoolExecutor

时间:2024-06-05 14:56:45浏览次数:15  
标签:Python submit 并发 future 线程 executor test ThreadPoolExecutor

concurrent.futures 是Python中执行异步编程的重要工具,它提供了以下两个类:

 1.ThreadPoolExecutor

from concurrent.futures import ThreadPoolExecutor

def test(num):
    print("Threads" num)

# 新建ThreadPoolExecutor对象并指定最大的线程数量
with ThreadPoolExecutor(max_workers=3) as executor:
    # 提交多个任务到线程池中
    executor.submit(test, 1)
    executor.submit(test, 2)
    executor.submit(test, 3)

2、ProcessPoolExecutor

 
from concurrent.futures import ProcessPoolExecutor

def test(num):
    print("Processs" num)

# 新建ProcessPoolExecutor对象并指定最大的进程数量
with ProcessPoolExecutor(max_workers=3) as executor:
    # 提交多个任务到进程池中
    executor.submit(test, 1)
    executor.submit(test, 2)
    executor.submit(test, 3)

 

等待任务完成

1、ThreadPoolExecutor构造实例的时候,传入max_workers参数来设置线程池中最多能同时运行的线程数目。

2、使用submit函数来提交线程需要执行的任务(函数名和参数)到线程池中,并返回该任务的句柄,注意submit()不是阻塞的,而是立即返回。

3、通过submit函数返回的任务句柄,能够使用done()方法判断该任务是否结束。

4、使用cancel()方法可以取消提交的任务,如果任务已经在线程池中运行了,就取消不了。

5、使用result()方法可以获取任务的返回值。查看内部代码,发现这个方法是阻塞的。

在提交任务之后,我们通常需要等待它们完成,可以使用如下方法:

1、result()

用于获取 submit() 方法返回的 Future 对象的结果。该方法是同步的,Block主线程,直至得到结果或者抛异常。

 

from concurrent.futures import ThreadPoolExecutor

def test(num):
    print("Tasks" num)

# 新建ThreadPoolExecutor对象并指定最大的线程数量
with ThreadPoolExecutor(max_workers=3) as executor:
    # 提交多个任务到线程池中,并使用result方法等待任务完成
    future_1 = executor.submit(test, 1)
    future_2 = executor.submit(test, 2)
    future_3 = executor.submit(test, 3)
    print(future_1.result())
Task 1
Task 2
Task 3
None

2、add_done_callback()

from concurrent.futures import ThreadPoolExecutor

def callback(future):
    print("Task done? ", future.done())
    print("Result: ", future.result())

# 新建ThreadPoolExecutor对象并指定最大的线程数量
with ThreadPoolExecutor(max_workers=3) as executor:
    # 提交多个任务到线程池中,并添加“完成时”回调函数
    future_1 = executor.submit(pow, 2, 4)
    future_2 = executor.submit(pow, 3, 4)
    callback_future_1 = executor.submit(callback, future_1)

当使用 ThreadPoolExecutor 创建的线程池对象后,我们可以使用 submitmapshutdown等方法来操作线程池中的线程以及任务。

1、submit方法

ThreadPoolExecutorsubmit方法用于将任务提交到线程池中进行处理,该方法返回一个Future对象,代表将来会返回结果的值。submit方法的语法如下:

from concurrent.futures import ThreadPoolExecutor

def multiply(x, y):
    return x * y

with ThreadPoolExecutor(max_workers=3) as executor:
    future = executor.submit(multiply, 10, 5)
    print(future.result()) # 50

2、map方法

ThreadPoolExecutormap方法用于将函数应用于迭代器中的每个元素,该方法返回一个迭代器。map方法的语法如下:

from concurrent.futures import ThreadPoolExecutor

def square(x):
    return x * x

def cube(x):
    return x * x * x

with ThreadPoolExecutor(max_workers=3) as executor:
    results = executor.map(square, [1, 2, 3, 4, 5])
    for square_result in results:
        print(square_result)

    results = executor.map(cube, [1, 2, 3, 4, 5])
    for cube_result in results:
        print(cube_result)

3、shutdown方法

ThreadPoolExecutorshutdown方法用于关闭线程池,该方法在所有线程执行完毕后才会关闭线程池。shutdown方法的语法如下:

from concurrent.futures import ThreadPoolExecutor
import time

def task(num):
    print("Task {} is running".format(num))
    time.sleep(1)
    return "Task {} is complete".format(num)

with ThreadPoolExecutor(max_workers=3) as executor:
    futures = [executor.submit(task, i) for i in range(1, 4)]
    executor.shutdown()

 

 

 

 

 

 

 

 

 

标签:Python,submit,并发,future,线程,executor,test,ThreadPoolExecutor
From: https://www.cnblogs.com/alamZ/p/18233038

相关文章

  • python自动化测试框架,封装方法方式
    第一种:静态方法封装,接口调用入参定义一个(默认json),直接执行接口请求接口封装代码如下:classOrderTransactionService:@staticmethoddefgetComboProductList(body):url=http_host+'/service?serialize=7'headers={'Content-Type':'applic......
  • Python结合文件名称将多个文件复制到不同路径下
      本文介绍基于Python语言,针对一个文件夹下的大量栅格遥感影像文件,基于其各自的文件名,分别创建指定名称的新文件夹,并将对应的栅格遥感影像文件复制到不同的新文件夹下的方法。  首先,我们来看一下本文需要实现的需求。现有一个文件夹,其中有大量.tif格式的栅格遥感影像文件,以及......
  • python 标准库 dataclasses 使用指南
    简单使用dataclasses可以用来快速的定义数据类,并能够简单明了的指明该类所具有的属性和类型,比如,要定义一个名为Person的类,常规的写法如下:classPerson:def__int__(self,id:int,first_name:str,last_name:str,eye_color:str):self.id=idse......
  • Python从0到100(二十九):requests模块处理cookie
    1爬虫中使用cookie为了能够通过爬虫获取到登录后的页面,或者是解决通过cookie的反扒,需要使用request来处理cookie相关的请求1.1爬虫中使用cookie的利弊带上cookie的好处能够访问登录后的页面能够实现部分反反爬带上cookie的坏处一套cookie往往对应的是一个用户......
  • Python数据类型转换(新)
    目录Python数据类型的转换隐式类型转换显式类型转换Python数据类型的转换数据类型分为1.隐式类型转换2.显式类型转换隐式类型转换在隐式类型转换中,Python会自动将一种数据类型转换为另一种数据类型,不需要认为去干预比如在进行算术运算的时候,较低数据类型(整数)就会......
  • Python2 input函数漏洞利用
    在Python2中,input函数相当于eval(raw_input(prompt))如果输入的数据是一个恶意的表达式,存在任意代码执行的风险实例演示字符串拼接命令执行__import__('os').system('cat/etc/passwd')靶场利用在vulnhubbottleneck靶机中,遇到input漏洞利用的情况#核心......
  • Python3基本语法(新)
    目录基本语法输出print()格式化输出标识符import关键字保留字(关键字)注释多行注释1、单引号(''')2、双引号(""")缩进空行同一行显示多条语句等待用户输入inputimport与from...import基本语法输出print()print()是一个让计算机在屏幕上进行输出的'指令'.它分为四个部分1.prin......
  • Python数据类型(新)
    目录数据类型类型查看同时多个变量赋值标准数据类型1.数字(Number)2.字符串3.bool(布尔类型)4.元组元组的运算+运算+=运算*运算元组的删除5.列表(List)查找列表修改列表列表的切片列表是可以修改的列表的追加列表的插入列表的连接列表的删除列表的清空列表的复制6.字典查找字典......
  • 基于Python混沌系统和DNA编码的图像加密算法
    欢迎大家点赞、收藏、关注、评论啦,由于篇幅有限,只展示了部分核心代码。文章目录一项目简介二、功能三、系统四.总结一项目简介  一、项目背景随着互联网和多媒体技术的快速发展,数字图像作为信息传递的重要媒介,在各个领域得到广泛应用。然而,图像信息的传输......
  • 基于Python+OpenCV使用DNA编码和混沌图创建图像加密算法
    欢迎大家点赞、收藏、关注、评论啦,由于篇幅有限,只展示了部分核心代码。文章目录一项目简介二、功能三、系统四.总结一项目简介  一、项目背景与意义在数字信息时代,图像作为信息的重要载体,其安全性尤为重要。传统的图像加密方法往往存在安全性不足、加密效......