Python-线程池


什么是线程池?

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

线程池控制何时创建线程,以及线程在不使用时应该做什么。

使用线程池而不是手动启动、管理和关闭线程,该池的效率显着提高,尤其是在处理大量任务时。

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

Concurrent.futures 模块包括 Future 类和两个 Executor 类 - ThreadPoolExecutor 和 ProcessPoolExecutor。

未来班

Concurrent.futures.Future 类负责处理任何可调用对象(例如函数)的异步执行。要获取 Future 类的对象,您应该在任何 Executor 对象上调用 Submit() 方法。它不应该由其构造函数直接创建。

Future 类中的重要方法是 -

结果(超时=无)

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

取消()

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

取消()

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

跑步()

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

完毕()

如果调用成功取消或完成运行,则此方法返回 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