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

Python中如何使用concurrent.futures.threadThreadPoolExecutor()进行并发编程

发布时间:2023-12-24 07:29:48

在Python中,concurrent.futures模块提供了ThreadPoolExecutor类,用于创建线程池来进行并发编程。线程池可以通过ThreadPoolExecutor的构造函数来创建,然后可以使用submit()map()方法来将任务提交给线程池进行并发执行。

下面是使用ThreadPoolExecutor进行并发编程的一个例子:

import concurrent.futures
import time

# 定义一个任务函数,模拟耗时操作
def task(n):
    print(f"Task {n} started")
    time.sleep(1)  # 模拟耗时操作
    print(f"Task {n} finished")
    return n * 2

# 创建一个线程池
with concurrent.futures.ThreadPoolExecutor() as executor:
    # 提交任务给线程池进行并发执行,使用submit()方法
    futures = [executor.submit(task, i) for i in range(5)]

    # 获取任务的返回结果
    for future in concurrent.futures.as_completed(futures):
        result = future.result()
        print(f"Result: {result}")

在上面的例子中,首先定义了一个任务函数task(),它模拟了一个耗时的操作,然后创建了一个ThreadPoolExecutor对象作为线程池。

通过executor.submit()方法将任务提交给线程池进行并发执行,该方法返回一个Future对象,代表了该任务的执行状态和返回结果。将这些Future对象保存在一个列表中。

使用concurrent.futures.as_completed()函数遍历Future对象列表,它会返回一个迭代器,按照任务完成的顺序返回已经完成的Future对象。通过future.result()方法可以获取任务的返回结果。

运行上面的代码,可以看到输出结果类似于:

Task 0 started
Task 1 started
Task 2 started
Task 3 started
Task 4 started
Task 0 finished
Result: 0
Task 1 finished
Result: 2
Task 3 finished
Result: 6
Task 2 finished
Result: 4
Task 4 finished
Result: 8

通过线程池的并发执行,可以在任务执行过程中同时执行其他任务,并且可以异步获取任务的返回结果。

需要注意的是,ThreadPoolExecutor使用的是线程而不是进程,因此适合CPU密集型任务,而不适合I/O密集型任务。对于I/O密集型任务,可以考虑使用concurrent.futures.ProcessPoolExecutor类来创建进程池进行并发执行。