Python、线程和请求 : What happens when I make concurrent requests in one session?

标签 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 个 session (每个线程一个 session ),我是否能够通过通过其自己的 session 发送每个请求来更快地发送请求?

维护者已经推荐"one session per thread"所以这当然是可行的......但它会提高性能吗?

使用 aiohttp 和 async 会更好吗?

最佳答案

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

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

无论如何:总是自己测量

关于Python、线程和请求 : What happens when I make concurrent requests in one session?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48732506/

相关文章:

python - 从 CSV 文件中提取最后一行并将其放入另一个文件中,并使用 Python 中的文件名

python - 由于 Figsize,x 标签位于我的图形之外

c# - 单客户端 TCP 服务器模型

c - 在信号处理程序中暂停线程执行

PHP Session_start 挂起

python - 检查变量是否为整数

python - MousePressEvent,QGraphicsView中的位置偏移

c++ - 从 ui 线程显示窗口有时会阻塞主 ui 线程

php 你如何确保 $_POST 数据来自你的表单而不是外部影响?

php - 当我登录到另一个表CODEIGNITER时如何插入外键ID