📜  python 线程池 - Python (1)

📅  最后修改于: 2023-12-03 15:19:11.295000             🧑  作者: Mango

Python 线程池

在 Python 中,线程池是实现多线程并发处理的一种方式。线程池可以维护一定数量的线程,而不是在每个任务到达时都创建一个新的线程,从而避免了线程频繁创建销毁的开销,并且可以提高线程的重用率。

使用线程池的好处
  • 提高程序的并发处理能力和效率
  • 避免线程频繁创建销毁的开销
  • 可以控制线程的数量,避免线程过多导致的资源竞争和浪费
Python 中的线程池实现

Python 标准库中提供了线程池的实现,即 concurrent.futures 模块。该模块提供了 ThreadPoolExecutorProcessPoolExecutor 两个类,分别用于创建线程池和进程池。

ThreadPoolExecutor

ThreadPoolExecutor 类用于创建线程池,其构造方法如下:

ThreadPoolExecutor(max_workers=None, thread_name_prefix='')
  • max_workers:线程池中最多有多少个线程,默认为 None,此时根据需要自行创建线程。
  • thread_name_prefix:生成线程的名称前缀,默认为空字符串。

ThreadPoolExecutor 类提供了两个方法来提交任务:

  • submit(fn, *args, **kwargs):提交一个可调用对象,返回 Future 对象。
  • map(func, *iterables, timeout=None, chunksize=1):在线程池中并发执行可调用对象,返回一个迭代器,支持超时设置和分块处理。

Future 类表示异步计算的结果。可以通过以下方法获取 Future 对象的计算结果:

  • result(timeout=None):等待计算完毕并返回结果,默认不设置超时时间。
  • add_done_callback(fn):给 Future 对象添加回调函数,在计算完成时自动调用。
示例

下面是一个使用 ThreadPoolExecutor 类实现线程池并发执行任务的示例:

import concurrent.futures

def task(num):
    return num * num

with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
    futures = [executor.submit(task, i) for i in range(10)]
    for future in concurrent.futures.as_completed(futures):
        print(future.result())

运行结果如下:

0
1
4
9
16
25
36
49
64
81

上述代码中,我们定义了一个 task 函数,用来计算一个数的平方。通过 ThreadPoolExecutor 类的 submit 方法将 task 函数提交到线程池中,并返回 Future 对象。最后通过 concurrent.futures.as_completed 函数按照任务完成的顺序获取结果。

总结

线程池是实现多线程并发处理的一种方式,可以提高程序的效率和并发处理能力,避免线程频繁创建销毁的开销。Python 标准库中提供了 concurrent.futures 模块,其中的 ThreadPoolExecutor 类可以用于在 Python 中创建线程池。