【发布时间】:2018-07-21 19:09:48
【问题描述】:
假设我使用 ThreadPoolExecutor 通过 requests.Session 向服务器发出 5 个请求:
session = requests.Session()
executor = concurrent.futures.ThreadPoolExecutor(max_workers=5)
def post(data):
response = mysession.post('http://example.com/api/endpoint1', data)
return response
for data in (data1, data2, data3, data4, data5):
executor.submit(post, data)
由于我们对每个请求使用相同的 requests.Session,我们是否必须等待服务器确认第一个请求才能发送下一个请求?
如果我同时打开了 5 个会话(每个线程一个会话),我是否能够通过自己的会话发送每个请求来更快地发送请求?
维护者已经推荐了"one session per thread",所以它肯定是可行的......但是它会提高性能吗?
使用 aiohttp 和 async 会更好吗?
【问题讨论】:
-
首先你应该问
Session对象是否是线程安全的。阅读本文:stackoverflow.com/questions/18188044/… 似乎不是,所以我不会这样做。其次,每个线程一个会话不应显着影响性能(除非您正在处理数千个并发请求)。最后,您如何简单地衡量不同变体(包括异步)的性能? -
是的,我在我的帖子中链接到了关于 Session 对象线程安全的讨论(“每个线程一个会话”)。是的,衡量性能是一种方法,但我希望首先了解这些事情是如何工作的(“我们是否必须等待服务器确认”),因为盲测是盲目的。
-
服务器没有回复。服务器正在发送响应。 HTTP 的请求管道非常有限,尤其是在一个连接上。无论如何,库处理 HTTP 连接的方式可能会有所不同(它们是否在后台使用连接池?),所以只需测量它。
-
您应该将其发布为答案 :)
标签: python multithreading session python-requests