Python并发编程---concurrent.futures

Python并发编程—concurrent.futures

Executor

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

ThreadPoolExecutor 是一个 Executor 子类,它使用一个线程池来异步执行调用。

concurrent.futures.ThreadPoolExecutor(max_workers=None, thread_name_prefix=’’)

参数

max_workers: 设置线程数量
thread_name_prefix: 以允许用户控制由池创建的工作线程的线程名

ProcessPoolExecutor

ProcessPoolExecutor 类是一个 Executor 子类,它使用进程池来异步执行调用

concurrent.futures.ProcessPoolExecutor(max_workers=None, mp_context=None, initializer=None, initargs=())

参数

max_workers:设置进程数量
mp_context:
initializer:initializer是一个可选的callable,在每个工作进程的开头调用; initargs是传递给初始化程序的参数元组。

Future

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作为唯一参数被调用

模块功能

concurrent.futures.wait(fs, timeout=None, return_when=ALL_COMPLETED)

等待给定的future队列完成,返回一个命名的2元组集合,一个名为done,包含完成的future,一个命名为not_done,包含未完成的future

参数

fs:给定的future序列

timeout:设置等待时间

return_when:指定返回条件,这个函数有三个取值。FIRST_COMPLETED:任何future完成或取消时返回,FIRST_EXCEPTION:任何future抛出异常时返回,ALL_COMPLETED:所有future完成或取消时返回

concurrent.futures.as_completed(fs, timeout=None)

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

你可能感兴趣的:(Python并发编程---concurrent.futures)