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