深入理解Python线程池ThreadPoolExecutor


1、concurrent.futures


从Python3.2开始,标准库为我们提供了concurrent.futures模块,它提供了ThreadPoolExecutor和ProcessPoolExecutor两个类,实现了对threading和multiprocessing的进一步抽象,不仅可以帮我们自动调度线程,还可以做到:

  • 主线程可以获取某一个线程(或任务)的状态及返回值
  • 当一个线程完成的时候,主线程能够立即知道
  • 让多线程和多进程的编码接口一致

可见,concurrent.futures模块帮我们实现了并发的可见性和原子性

本文主要介绍concurrent.futures模块提供了ThreadPoolExecutor

ThreadPoolExecutor提供了两种创建线程池的方法submit()和map(),map()底层实际上调用了submit()

Python并发编程详解见文章:传送门

2、submit()


submit()用于提交要用给定参数执行的可调用对象,并返回表示可调用对象执行的Future实例

submit()不是阻塞的,而是立即返回。通过submit()返回的Future实例可以通过done()方法判断任务是否结束

'''
submit(func, args)
func:任务函数对象  args:函数参数,元组类型
'''

导入所需库:

import numpy as np
import pandas as pd
import requests
import json
import time
import os
import threading
from concurrent.futures import ThreadPoolExecutor, as_completed, wait, ALL_COMPLETED, FIRST_COMPLETED

假设任务函数:

def crawl(page):
    print(f"爬取{
     page+1}页已完成!")
    return page+1

submit()的使用需要用到一些线程池方法

线程池方法:

1)cancel()

cancel()方法可用于取消提交的排队等候的任务,如果任务已经在线程池中运行了,则无法取消

2)result()

result()方法可用来获取任务的返回值。查看内部代码,发现这个方法是阻塞的

with ThreadPoolExecutor(max_workers=2) as executor:
    futures = [executor.submit(crawl, page) for page in range(5)]
    # 判断任务是否完成
    dones = [future.done() for future in futures]
    print(dones)
    # 获取任务的返回值
    results = [future.result() for future in futures]
    print(results)

'''
爬取1页已完成!
爬取2页已完成!
[True, True, False, False, False]
爬取3页已完成!
爬取4页已完成!
爬取5页已完成!
[1, 2, 3, 4, 5]
'''

3)as_completed()

as_completed()方法可用于一次判断所有任务执行结果,as_compl

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值