python线程池的使用

from concurrent.futures import ThreadPoolExecutor, as_completed, wait,ALL_COMPLETED,FIRST_COMPLETED
import time
# 创建线程池对象,最大线程个数为3
executor = ThreadPoolExecutor(max_workers=3)

def thread_func(times):
    time.sleep(times)
    print(times)
    return times

if None:
    # 通过submit将需要执行函数提交到线程池中,submit会立即返回,不阻塞主线程
    # 线程超过最大数等待之前线程运行结束会复用线程
    task1 = executor.submit(thread_func, 5)
    task2 = executor.submit(thread_func, 2)
    task3 = executor.submit(thread_func, 4)

    print(task1.done()) # 用于查看task1是否完成执行
    print(task1.running()) # 当前线程正在执行则返回true

    #查看线程函数返回的结果,该方法是阻塞的,只有线程函数完成后才返回 
    # print(task1.result()) #output:5

    # 当然可以设置超时时间,timeout=2,若超时线程函数运行没有结束,则会抛出超时异常
    # print(task3.result(timeout=2))
    print("end")

if None:
    # 想知道线程池中任务是否执行完,使用done进行循环判断,不会实时的
    # 可以让每个线程运行结束后通知主线程
    # as_completed生成器使用,会阻塞,直到有线程运行结束,线程函数
    # 返回顺序根据函数执行所花时间对应,时间越短先返回
    param_list = [4,2,3]
    all_task = [executor.submit(thread_func, param) for param in param_list]

    for task in as_completed(all_task):
        print(task.result())
        
if None:
    # 可以使用map映射,将参数和线程函数绑定并提交到线程池中并返回线程
    # 函数执行结果的迭代器,但是函数返回顺序根列表一直
    param_list = [4,1,3]
    for res in executor.map(thread_func, param_list):
        print(res)
        

if 1:
    # 使用wait可以等待所有线程都执行完毕后才往下继续运行
    # 否则阻塞
    param_list = [4,2,3]
    all_task = [executor.submit(thread_func, param) for param in param_list]
    # wait(all_task) # 默认是ALL_COMPLETED,所有线程返回,否则阻塞
    
    # FIRST_COMPLETED只等待其中一个线程返回,done是返回的线程,not_done是未返回的线程
    # 有一个线程返回,变为非阻塞
    done, not_done = wait(all_task, return_when=FIRST_COMPLETED)
    print(done, not_done)
    print("main process")
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值