【发布时间】:2022-01-06 13:42:22
【问题描述】:
我是第一次使用 concurrent.futures 并遵循官方指南。
问题:在 as_completed() 块中,如何访问 future_to_url 中的 k、v?
k 变量至关重要。
使用类似的东西:
for (future, k,v) in zip(concurrent.futures.as_completed(future_to_url), urls.items()):
我偶然发现了this post,但是我无法破译重现的语法
原创
def start():
with concurrent.futures.ThreadPoolExecutor(max_workers=50) as executor:
future_to_url = {executor.submit(visit_url, v): v for k, v in urls.items()}
for future in concurrent.futures.as_completed(future_to_url):
data = future.result()
json = data.json()
print(f"k: {future[k]}")
第二次尝试 - 使用破坏的 zip
def start():
with concurrent.futures.ThreadPoolExecutor(max_workers=50) as executor:
future_to_url = {executor.submit(visit_url, v): v for k, v in urls.items()}
for (future, k, v) in zip(concurrent.futures.as_completed(future_to_url), urls.items()):
data = future.result()
json = data.json()
print(f"k: {k}")
第三次失败尝试 - 使用地图 source
for future, (k, v) in map(concurrent.futures.as_completed(future_to_url), scraping_robot_urls.items()):
TypeError: 'generator' 对象不可调用
Fourth Broken Attempt - 在 as_completed() 循环之前存储 k,v 对并将它们与枚举索引配对
with concurrent.futures.ThreadPoolExecutor(max_workers=50) as executor:
future_to_url = {executor.submit(get_response, v): v for k, v in scraping_robot_urls.items()}
info = {k: v for k, v in scraping_robot_urls.items()}
for i, future in enumerate(concurrent.futures.as_completed(future_to_url)):
url = future_to_url[future]
data = future.result()
print(f"data: {data}")
print(f"key: {list(info)[i]} / url: {url}")
这不能作为 URL 工作,与密钥不匹配,它们似乎不匹配,我不能依赖这种行为工作。
为了完整起见,这里是依赖项
def visit_url(url):
return requests.get(url)
urls = {
'id123': 'www.google.com',
'id456': 'www.bing.com',
'id789': 'www.yahoo.com'
}
灵感来源:
【问题讨论】:
-
洞察力是,使用 executor.submit 生成的未来作为保存引用的字典的键。然后concurrent.futures.as_completed(对dict.keys()进行操作)
标签: python