Python,线程和请求:当我在一个会话中发出并发请求时会发生什么?

时间:2018-02-11 14:24:55

标签: python multithreading session python-requests

假设我使用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会更好吗?

1 个答案:

答案 0 :(得分:0)

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

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

无论如何:总是自己衡量