下面使用了concurrent.future : 并发入门
例子中的ThreadPoolExecutor可以改成ProcessPoolExecutor 试试看,接口统一
另外ProcessPoolExecutor 的参数默认值:os.cpu_count()
map , submit, as_completed的参数及返回.参考文档
分别使用了map 以及 submit 和 as_completed完成下载;
注意: as_completed 返回的future是完成或失败的.正在运行的不会返回;
可以修改max_workers参数看看变化
首先是map方法 . 如果你修改了我的代码去迭代map的返回值需要注意 迭代过程中会调用future.result() 因此会阻塞,
而我的代码中会阻塞的原因是在with 块中,最后会调用executor.shutdown,这个函数会等待所有的线程完成或失败
:
from concurrent import futures
import requests,time,sys,os
#常量
FLAGS = ('CN IN US ID BR PK NG BD RU JP '
'MX PH VN ET EG DE IR TR CD FR').split()
BASE_URL = 'http://flupy.org/data/flags' #下载url
DEST_DIR = 'downloads/' #保存目录
CHUNK_SIZE = 8192 #块大小
MAX_THREAD = 2