线程池
code
import os
import time
from concurrent.futures.thread import ThreadPoolExecutor
def test(n):
print(f'n:{n}-os.getpid:{os.getpid()}')
time.sleep(2)
return 'hello'
# 定义一个回调函数,异步提交完后,有结果自动调用该函数
def call_back(n):
print(f'nn;{n}')
print(f'callback:n.result:{n.result()}')
if __name__ == '__main__':
pool = ThreadPoolExecutor(5)
print('zhu')
t_list = []
for i in range(10):
res = pool.submit(test, i)
# res = pool.submit(test, i).add_done_callback(call_back)
t_list.append(res)
print(f't_list:{t_list}')
pool.shutdown() # 等待线程池中所有任务运行完毕,关闭线程池
在这段代码中,pool.submit(test, i) 是使用 concurrent.futures.ThreadPoolExecutor 提交任务的一个方法。让我们详细解析这个代码段中的每一个部分:
-
ThreadPoolExecutor: 这是一个来自
concurrent.futures模块的类,用于创建一个线程池。线程池允许你管理和复用一组线程,以便并行地执行任务。 -
pool = ThreadPoolExecutor(5): 这行代码创建了一个包含5个线程的线程池。这个池可以同时处理最多5个任务。
-
pool.submit(test, i): 这是核心的任务提交方法。
submit方法用于向线程池提交一个要执行的任务。它执行以下操作:test: 这个是要在线程池中执行的函数。i: 这是传递给函数test的参数。在这个例子中,i代表一个整数,表示任务的标识或循环索引。
-
返回值:
submit方法返回一个Future对象。这个对象代表了异步执行的任务,可以用来获取任务的执行状态或返回结果。 -
add_done_callback(call_back): 这个方法将一个回调函数附加到
Future对象上。这个回调函数call_back会在任务完成后自动执行。n.result()在call_back函数中被调用,用于获取任务的返回结果,在这个例子中就是'hello'。
总结一下,在这段代码中,pool.submit(test, i) 向线程池提交了一个任务,该任务会在后台线程中异步执行 test 函数,并传入参数 i。一旦函数 test 执行完成,add_done_callback(call_back) 将自动调用 call_back 函数,打印出任务的结果。
参考2:

参考3

- pool.submit(blocking_function):将 blocking_function 提交给线程池执行器。该方法返回一个 Future 对象,表示该任务的异步执行。
- future.result():等待 blocking_function 的执行完成并获取结果。
- 使用
with语句管理线程池的上下文,确保在退出时正确关闭线程池。

浙公网安备 33010602011771号