假设我使用ThreadPoolExecutor通过request.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)
由于我们对每个请求都使用相同的request.Session,因此是否必须等待服务器确认第一个请求才能发送下一个请求?
如果我同时打开5个会话(每个线程一个会话),是否可以通过自己的会话发送每个请求来更快地发送请求?
维护人员已经建议“每个线程一个会话”,因此这肯定是可行的……但是会提高性能吗?
使用aiohttp和async会更好吗?
因此,首先,如果您不确定某些对象/函数是否是线程安全的,则应假定不是。因此,如果Session
没有适当的锁定,则不应在多个线程中使用对象。
至于性能:始终衡量。许多库往往在后台做很多事情,包括打开多个TCP连接。可以将它们配置为调整性能,因此很难精确地回答问题。特别是因为我们不知道您的情况。例如,如果您打算发出5个并行请求,则只需运行5个带有5个会话对象的线程即可。您很可能不会在lib之间看到差异(除非您选择了一个非常糟糕的lib)。另一方面,如果您正在查看成百上千的并发请求,那将很重要。
无论如何:请始终自己进行测量。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句