首页 > 解决方案 > 发生错误时如何重新执行 ThreadPoolExecutor 中的函数?

问题描述

我正在尝试python文档中的python示例代码。ThreadPoolExecutorconcurrent.futures具体来说

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
    future_to_url = {executor.submit(load_url, url, 60): url for url in URLS}
    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:
            print('%r page is %d bytes' % (url, len(data)))

concurrent.futures.as_completed(future_to_url)如果在循环内产生异常,如何重新向执行程序发送调用?基本上我只是想重试失败的工作。

我试过简单地调用类似的东西,executor.submit(...)但它似乎不起作用。

欢迎任何建议,谢谢

标签: pythonmultithreadingthreadpoolpython-multithreadingconcurrent.futures

解决方案


期货是在失败后实现的。失败是他们的价值。因此,您不能重新执行它们,您必须创建一个新的 Future。

由于您有 URL,您可以在错误处理程序上执行此操作,并且在 Futuresfuture_to_url完成后,迭代添加到不同集合中的新 Futures。


推荐阅读