如何在Python的Futures任务间设置延迟?基于官方示例的修改方案
无需重写全部代码,仅需调整任务提交逻辑
你不需要重写整个代码,只需要修改任务提交的部分,同时引入time模块实现延迟即可。
原代码用字典推导式一次性将所有任务提交给线程池,导致请求几乎同时发出。我们可以改成逐个提交任务,每提交一个就暂停100毫秒,调整后的代码如下:
import concurrent.futures import urllib.request import time # 新增导入time模块 URLS = ['http://www.foxnews.com/', 'http://www.cnn.com/', 'http://europe.wsj.com/', 'http://www.bbc.co.uk/', 'http://nonexistant-subdomain.python.org/'] # 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: # 替换原字典推导式,改为逐个提交加延迟 future_to_url = {} for url in URLS: future = executor.submit(load_url, url, 60) future_to_url[future] = url time.sleep(0.1) # 延迟100毫秒 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)))
关键调整点:
- 新增
import time,调用sleep方法实现间隔延迟 - 将一次性提交的字典推导式拆为循环,每提交一个任务后暂停0.1秒(即100毫秒)
- 任务执行、结果处理的原有逻辑完全保留,无需改动
这样就能保证每个任务的提交间隔100毫秒,避免请求同时发送。
内容的提问来源于stack exchange,提问作者FakeDisy
相关产品推荐
相关产品推荐

