欢迎访问宙启技术站
智能推送

使用concurrent.futures库在Python中实现并发任务调度

发布时间:2023-12-13 04:47:43

concurrent.futures是Python内置的多线程/多进程并发任务调度库。它提供了一种简单的方法来并行执行任务,并获得结果。该库在Python 3.2及以上版本中可用。

concurrent.futures库主要提供了两个类:ThreadPoolExecutor和ProcessPoolExecutor。ThreadPoolExecutor用于创建线程池,利用线程池实现并发执行任务;ProcessPoolExecutor用于创建进程池,利用进程池实现并发执行任务。这两个类的用法非常类似,我们将以ThreadPoolExecutor为例进行说明。

首先,我们需要创建一个ThreadPoolExecutor对象。创建ThreadPoolExecutor对象时,可以指定线程池的大小,即同时可执行的最大线程数。下面是创建线程池对象的示例代码:

import concurrent.futures

with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
    # 在此处执行并发任务

在上面的代码中,我们创建了一个最大线程数为5的线程池。

接下来,我们可以使用线程池对象的submit()方法来提交任务。submit()方法的参数是一个可调用对象,可以是函数、方法或类的实例方法,并返回一个Future对象,用于跟踪任务的状态和获取结果。下面是提交任务的示例代码:

import concurrent.futures

def task(n):
    # 执行任务的代码
    return n * n

with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
    future = executor.submit(task, 5)
    # future对象可以用来获取任务的状态和结果

在上面的代码中,我们定义了一个名为task的函数作为任务,该函数接受一个参数n,并返回n的平方。然后,我们使用submit()方法提交了一个任务,传递参数5给task函数,并将返回的Future对象赋值给了future变量。

我们可以使用Future对象的done()方法来检查任务是否已完成,使用result()方法来获取任务的结果。下面是获取任务结果的示例代码:

import concurrent.futures

def task(n):
    # 执行任务的代码
    return n * n

with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
    future = executor.submit(task, 5)
    if future.done():
        result = future.result()
        print(result)

在上面的代码中,我们先使用done()方法判断任务是否已完成,如果已完成,则使用result()方法获取任务的结果,并将结果打印出来。

如果我们有一组任务需要并发执行,并获取它们的结果,可以使用ThreadPoolExecutor的map()方法。map()方法的参数是一个可迭代对象,每个元素是一个任务,并行执行这些任务,并返回一个迭代器,用于获取任务的结果。下面是使用map()方法并行执行任务的示例代码:

import concurrent.futures

def task(n):
    # 执行任务的代码
    return n * n

with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
    results = executor.map(task, [1, 2, 3, 4, 5])
    for result in results:
        print(result)

在上面的代码中,我们定义了一个名为task的函数作为任务,该函数接受一个参数n,并返回n的平方。然后,我们使用map()方法并行执行了一组任务,传递一个包含5个任务的列表给map()方法,并使用for循环遍历结果并打印出来。

总结来说,concurrent.futures库提供了一种简单的方法来实现并发任务调度。使用ThreadPoolExecutor或ProcessPoolExecutor可以创建线程池或进程池,通过submit()方法提交任务并获取Future对象,通过done()和result()方法获取任务的状态和结果。使用map()方法可以并行执行一组任务并获取结果。