线程池

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 提交任务的一个方法。让我们详细解析这个代码段中的每一个部分:

  1. ThreadPoolExecutor: 这是一个来自 concurrent.futures 模块的类,用于创建一个线程池。线程池允许你管理和复用一组线程,以便并行地执行任务。

  2. pool = ThreadPoolExecutor(5): 这行代码创建了一个包含5个线程的线程池。这个池可以同时处理最多5个任务。

  3. pool.submit(test, i): 这是核心的任务提交方法。submit 方法用于向线程池提交一个要执行的任务。它执行以下操作:

    • test: 这个是要在线程池中执行的函数。
    • i: 这是传递给函数 test 的参数。在这个例子中,i 代表一个整数,表示任务的标识或循环索引。
  4. 返回值: submit 方法返回一个 Future 对象。这个对象代表了异步执行的任务,可以用来获取任务的执行状态或返回结果。

  5. 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 语句管理线程池的上下文,确保在退出时正确关闭线程池。
posted @ 2023-10-24 16:48  tslam  阅读(29)  评论(0)    收藏  举报