Python 线程池

Python 线程池

什么是线程池

线程池是一种自动管理工作线程池的机制。池中的每个线程被称为工作者线程或工作线程。一旦任务完成,工作线程可以被重复使用。每个线程只能执行一次任务。

线程池控制何时创建线程,以及线程在闲置时应该做什么。

使用线程池比手动启动、管理和关闭线程要高效得多,尤其是在有大量任务的情况下。

Python中的多线程可同时执行特定函数。可以通过concurrent.futures模块中定义的ThreadPoolExecutor类实现多线程对函数的异步执行。

concurrent.futures模块包括Future类和两个Executor类–ThreadPoolExecutor和ProcessPoolExecutor。

Future类

concurrent.futures.Future类负责处理任何可调用对象的异步执行,如函数。要获取Future类的对象,应该在任何Executor对象上调用submit()方法。不应该直接通过构造函数来创建Future类对象。

Future类中的重要方法有:

result(timeout=None)

此方法返回调用的结果值。如果调用尚未完成,则此方法将等待timeout秒。如果在timeout秒内调用未完成,则会引发TimeoutError。如果未指定timeout,则等待时间没有限制。

cancel()

此方法尝试取消调用。如果调用当前正在执行或完成运行且无法取消,则该方法返回False,否则将取消调用并返回True。

cancelled()

此方法如果成功取消调用,则返回True。

running()

此方法如果调用当前正在执行且无法取消,则返回True。

done()

此方法如果成功取消调用或完成运行,则返回True。

ThreadPoolExecutor类

该类表示池中指定数量的最大工作线程,以异步方式执行调用。

concurrent.futures.ThreadPoolExecutor(max_threads)

示例

from concurrent.futures import ThreadPoolExecutor
from time import sleep
def square(numbers):
   for val in numbers:
      ret = val*val
      sleep(1)
      print("Number:{} Square:{}".format(val, ret))
def cube(numbers):
   for val in numbers:
      ret = val*val*val
      sleep(1)
      print("Number:{} Cube:{}".format(val, ret))
if __name__ == '__main__':
   numbers = [1,2,3,4,5]
   executor = ThreadPoolExecutor(4)
   thread1 = executor.submit(square, (numbers))
   thread2 = executor.submit(cube, (numbers))
   print("Thread 1 executed ? :",thread1.done())
   print("Thread 2 executed ? :",thread2.done())
   sleep(2)
   print("Thread 1 executed ? :",thread1.done())
   print("Thread 2 executed ? :",thread2.done())

它将产生以下 输出

Thread 1 executed ? : False
Thread 2 executed ? : False
Number:1 Square:1
Number:1 Cube:1
Number:2 Square:4
Number:2 Cube:8
Thread 1 executed ? : False
Thread 2 executed ? : False
Number:3 Square:9
Number:3 Cube:27
Number:4 Square:16
Number:4 Cube:64
Number:5 Square:25
Number:5 Cube:125
Thread 1 executed ? : True
Thread 2 executed ? : True

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程