python concurrent.futures 模块启动并行任务

concurrent.futures 模块提供了一种高层次的界面,用于异步执行可调用对象(通常是函数)。这个模块在 Python 3.2 及更高版本中可用。主要的类和函数为:

1. Executor 类:

    Executor 是一个抽象类,定义了异步执行可调用对象的通用接口。具体的实现类包括 ThreadPoolExecutorProcessPoolExecutor

2. ThreadPoolExecutor 类:

   ThreadPoolExecutor 是一个使用线程池执行任务的实现。它允许将可调用对象提交到线程池中,并在后台异步执行。

3.ProcessPoolExecutor 类:

  ProcessPoolExecutor 是一个使用进程池执行任务的实现。与 ThreadPoolExecutor 不同,ProcessPoolExecutor 在不同的进程中执行任务,适用于CPU密集型任务。

4. Future 类:

  Future 表示异步计算的结果。通过 Executor.submit() 方法获得 Future 对象,然后可以在将来的某个时候获取实际的结果。

5. as_completed 函数:

  as_completed 函数是一个生成器,它迭代一组 Future 对象,返回已完成的 Future。可以用于按照完成顺序获取结果。

6. wait 函数:

  wait 函数用于等待一组 Future 对象完成。可以指定超时时间,以便在超时后取消未完成的任务。

import concurrent.futures
import urllib.request
URLS = ['http://www.foxnews.com/',
        'http://www.cnn.com/',
        'http://europe.wsj.com/',
        'http://www.bbc.co.uk/',
        'http://some-made-up-domain.com/']
# Retrieve a single page and report the URL and contents
def load_url(url, timeout):
    with urllib.request.urlopen(url, timeout=timeout) as conn:
        return conn.read()
# We can use a with statement to ensure threads are cleaned up promptly
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
    # Start the load operations and mark each future with its URL
    
    ## 返回concurrent.futures.Future对象
    #future = executor.submit(load_url, URLS[0], 60)
    #print(future)
    
    ## 返回字典,键为future对象,值为网址
    future_to_url = {executor.submit(load_url, url, 60): url for url in URLS}
    #print(future_to_url)
    
    ## as_completed: used to iterate over the Future objects as they are completed.
    #for future in concurrent.futures.as_completed(future_to_url.keys()):
    for future in concurrent.futures.as_completed(future_to_url):
        url = future_to_url[future]       
        try:
            data = future.result()
        except Exception as exc:
            print('%r generated an exception: %s' % (url, exc))
        else:
            # %r格式说明符用于字符串格式中,用于使用对象的__repr_方法表示对象的可打印版本。
            print('%r page is %d bytes' % (url, len(data)))
            ## 超链接形式
            #print('%s page is %d bytes' % (url, len(data)))

参考:

https://www.bookstack.cn/read/python-3.10.0-zh/89c904110447ef59.md

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值