声明:
本文主要参考文章:https://www.jianshu.com/p/b9b3d66aa0be
尊重原创,如有侵权,请联系删除
从Python3.2开始,标准库为我们提供了concurrent.futures
模块,它提供了ThreadPoolExecutor和ProcessPoolExecutor两个类,实现了对threading和multiprocessing的进一步抽象,不仅可以帮我们自动调度线程,还可以做到:
可见,concurrent.futures
模块帮我们实现了并发的可见性和原子性
本文主要介绍concurrent.futures
模块提供了ThreadPoolExecutor
ThreadPoolExecutor提供了两种创建线程池的方法submit()和map(),map()底层实际上调用了submit()
Python并发编程详解见文章:传送门
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