​python中线程池使用

时间:2022-07-24
本文章向大家介绍​python中线程池使用,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

python中线程池使用

==

TOC

一、简介

这里介绍在python中使用ThreadPoolExecutor进行多线程开发。

二、流程

2.1 线程池创建

#这里指定线程个数为3
executor = ThreadPoolExecutor(3)

2.2 任务执行

Executor的submit方法:不等待每个任务结果返回
Executor的map方法:等待每个任务结果返回,有任务完成就马上返回完成任务,其它未完成任务则继续等待

2.3 任务完成等待

使用Executor的map方法执行
使用as_completed方法等待每一个任务
使用wait方法等待所有任务
对future添加回调函数add_done_callback处理结果

2.4 线程池关闭

Executor的shutdown方法

三、示例

import time
import uuid
from concurrent.futures._base import as_completed, wait
from concurrent.futures.thread import ThreadPoolExecutor
from datetime import datetime

def hello(name):
    '''
    待执行任务
    :param name:
    :return:
    '''
    print('{} {}'.format(name, datetime.now()))
    time.sleep(1)
    return name

def hello_callback(future):
    '''
    待执行任务回调结果处理
    :param future:
    :return:
    '''
    print("hello_callback for task finish, r: {}".format(future.result()))


def execute_no_wait():
    '''
    任务执行结果不等待,通过添加回调函数处理结果
    :return:
    '''
    executor = ThreadPoolExecutor(3)
    for i in range(1, 100):
        f = executor.submit(hello, uuid.uuid1())
        # 通过添加回调函数处理结果
        f.add_done_callback(hello_callback)
    executor.shutdown()

def execute_wait_by_as_completed():
    '''
    任务执行结果等待,使用as_completed方法
    :return:
    '''
    executor = ThreadPoolExecutor(3)
    future_list = [executor.submit(hello, uuid.uuid1()) for i in range(1, 100)]
    # 等待任务执行完成,使用as_completed方法, as_completed是一个生成器,当有任务完成时,立刻返回完成任务的结果,否则阻塞
    for f in as_completed(future_list):
        r = f.result()
        print('{} finish'.format(r))
    executor.shutdown()


def execute_wait_by_executor_map():
    '''
    任务执行结果等待,使用Executor.map方法执行任务
    :return:
    '''
    executor = ThreadPoolExecutor(3)
    # 使用Executor.map方法执行任务,等待返回结果,当有任务完成时,立刻返回完成任务的结果,否则阻塞
    for r in executor.map(hello, [uuid.uuid1() for i in range(1, 100)]):
        print('{} finish'.format(r))
    executor.shutdown()

def execute_wait_by_wait():
    '''
    任务执行结果等待,使用wait方法等待所有任务完成
    :return:
    '''
    executor = ThreadPoolExecutor(3)
    future_list = [executor.submit(hello, uuid.uuid1()) for i in range(1, 100)]
    # 使用wait方法等待所有任务完成
    wait(future_list)
    for f in future_list:
        r = f.result()
        print('{} finish'.format(r))
    executor.shutdown()

def main():
    execute_no_wait()
    execute_wait_by_as_completed()
    execute_wait_by_executor_map()
    execute_wait_by_wait()

if __name__ == '__main__':
    main()