【问题标题】:Python, threading, and requests: What happens when I make concurrent requests in one session?Python、线程和请求:当我在一个会话中发出并发请求时会发生什么?
【发布时间】: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


【解决方案1】:

所以,首先如果你不确定某个对象/函数是否是线程安全的,你应该假设它不是。因此,您不应在没有适当锁定的情况下在多个线程中使用 Session 对象。

至于表现:总是衡量。许多库倾向于在后台做很多事情,包括打开多个 TCP 连接。它们可能可以配置为调整性能,因此很难准确回答这个问题。特别是因为我们不知道你的情况。例如,如果您打算发出 5 个并行请求,则只需运行 5 个线程和 5 个会话对象。很可能您不会看到库之间的差异(除非您选择了一个非常糟糕的库)。另一方面,如果您正在查看成百上千的并发请求,这将很重要。

无论如何:总是自己衡量

【讨论】:

    猜你喜欢
    • 2017-03-24
    • 2012-06-24
    • 1970-01-01
    • 2014-08-26
    • 1970-01-01
    • 1970-01-01
    • 2013-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多