前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >​python中线程池使用

​python中线程池使用

原创
作者头像
panda-star
修改2020-09-10 10:10:35
2.5K0
修改2020-09-10 10:10:35
举报
文章被收录于专栏:actionaction

python中线程池使用

==

TOC

一、简介

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

二、流程

2.1 线程池创建
代码语言:txt
复制
#这里指定线程个数为3
executor = ThreadPoolExecutor(3)
2.2 任务执行
代码语言:txt
复制
Executor的submit方法:不等待每个任务结果返回
Executor的map方法:等待每个任务结果返回,有任务完成就马上返回完成任务,其它未完成任务则继续等待
2.3 任务完成等待
代码语言:txt
复制
使用Executor的map方法执行
使用as_completed方法等待每一个任务
使用wait方法等待所有任务
对future添加回调函数add_done_callback处理结果
2.4 线程池关闭
代码语言:txt
复制
Executor的shutdown方法

三、示例

代码语言:txt
复制
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()

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、简介
  • 二、流程
    • 2.1 线程池创建
      • 2.2 任务执行
        • 2.3 任务完成等待
          • 2.4 线程池关闭
          • 三、示例
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档