深入理解Python线程池ThreadPoolExecutor

Python线程池ThreadPoolExecutor

    • 1、concurrent.futures
    • 2、submit()
    • 3、map()
    • 4、案例:多线程爬虫


声明:
本文主要参考文章:https://www.jianshu.com/p/b9b3d66aa0be
尊重原创,如有侵权,请联系删除

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

你可能感兴趣的:(#,Python,#,网络爬虫,python,网络爬虫)