首页 > 解决方案 > 并行网络请求:比较不同的方法

问题描述

我想一次请求 100 个网址,目前正在这样做:

responses = list(PoolExecutor(max_workers=NUM_PARALLEL).map(
                 lambda xml: requests.post(URL, headers=HEADERS, data={'message': xml}), 
                 xmls))

关于这个的几个问题:

  1. list“评估”实际生成器对象/表达式的最佳方法吗?除非我这样做,否则list我只会得到类似的东西:<generator object Executor.map.<locals>.result_iterator at 0x10ecf9888>
  2. PoolExecutor在python3中经常用来做并行网络请求,还是有其他更可取的方法?
  3. PoolExecutor之间有什么区别?AsyncIOconcurrent.futures

标签: pythonpython-3.xconcurrencypool

解决方案


list 是“评估”实际生成器对象/表达式的最佳方法吗?除非我列出我只会得到类似的东西: .result_iterator at 0x10ecf9888>

我认为Stack Overflow中有一个具体的答案可以解决您的问题。

python3中是否经常使用PoolExecutor做并行网络请求,还是有其他更可取的方法?

是的,还有其他方法,您可以在 StackOverflow 中找到至少一个问题,给出不同的示例。在该问题的答案中,只有一个人在使用concurrent.futures.ThreadPoolExecutor,这是您最接近PoolExecutor那里的人。

PoolExector、AsyncIO 和 concurrent.futures 做这样的事情有什么区别?

这个问题的答案可以在《在 Python 中使用 Asyncio》一书的第 3 章 Asyncio 演练中找到。更准确地说,AsyncIO 提供的 API 与 concurrent.futures 包中的 API 非常相似。这个包提供了一个ThreadPoolExecutor和一个ProcessPoolExecutor。默认是基于线程的,但可以使用基于线程或基于池的执行器。


推荐阅读