concurrent.futures.Executor: 一个抽象类,提供了异步执行调用的方法。一般都是通过调用子类来使用。
submit(fn, *args, **kwargs):执行可调用对象,返回一个Future对象表示执行的可调用对象
map(func, *iterables, timeout=None, chunksize=1):使用时ProcessPoolExecutor,此方法将iterables切割 为多个块,并将其作为单独的任务提交给池。chunksize设置分块大小。使用时ThreadPoolExecutor时,chunksize无效
shutdown(wait=True):告executor执行者执行完毕,释放资源
ThreadPoolExecutor 是一个 Executor 子类,它使用一个线程池来异步执行调用。
max_workers: 设置线程数量
thread_name_prefix: 以允许用户控制由池创建的工作线程的线程名
ProcessPoolExecutor 类是一个 Executor 子类,它使用进程池来异步执行调用
max_workers:设置进程数量
mp_context:
initializer:initializer是一个可选的callable,在每个工作进程的开头调用; initargs是传递给初始化程序的参数元组。
Future 类封装了一个可调用的异步执行。 Future 实例由 Executor.submit() 创建。
cancel():尝试取消呼叫。如果呼叫当前正在执行并且不能被取消,则该方法将返回 False,否则呼叫将被取消,并且该方法将返回 True。
cancelled():如果呼叫成功取消,则返回 True。
running():如果呼叫当前正在执行并且无法取消,则返回 True。
done():如果呼叫成功取消或完成运行,则返回 True。
result(timeout=None):返回调用对象返回的值
exception(timeout=None):返回调用对象引发的异常
add_done_callback(fn):当future完成或取消时,fn将以future作为唯一参数被调用
等待给定的future队列完成,返回一个命名的2元组集合,一个名为done,包含完成的future,一个命名为not_done,包含未完成的future
fs:给定的future序列
timeout:设置等待时间
return_when:指定返回条件,这个函数有三个取值。FIRST_COMPLETED:任何future完成或取消时返回,FIRST_EXCEPTION:任何future抛出异常时返回,ALL_COMPLETED:所有future完成或取消时返回
as_completed 接收一个future 列表,返回值是一个迭代器,在运行结束后产出future
fs:给定的future序列
timeout:设置等待时间
import concurrent.futures
import requests
urls = ['http://www.qq.com/',
'http://www.baidu.com/',
'http://www.taobao.com/',
'http://www.csdn.net/',
'http://www.jianshu.com/']
def load_url(url, timeout):
with requests.get(url, timeout=timeout) as conn:
return conn.content
def main():
futures = {}
# 多进程和多线程用法相同
with concurrent.futures.ProcessPoolExecutor(max_workers=5) as executor:
for url in urls:
future = executor.submit(load_url, url, 60)
futures[future] = url
for future in concurrent.futures.as_completed(futures):
url = futures[future]
try:
data = future.result()
except Exception as exc:
print('%r generated an exception: %s' % (url, exc))
else:
print('%r page is %d bytes' % (url, len(data)))
if __name__ == "__main__":
main()
'http://www.baidu.com/' page is 2381 bytes
'http://www.qq.com/' page is 228308 bytes
'http://www.taobao.com/' page is 143856 bytes
'http://www.csdn.net/' page is 206699 bytes
'http://www.jianshu.com/' page is 583 bytes