Python 如何处理异步 REST 请求
How Python handles asynchronous REST requests
场景:假设我有一个用 Python 编写的 REST API(可能使用 Flask),它存储了一个全局变量。 API 有两个端点,一个读取变量和 returns 变量,另一个写入变量。现在,我有两个客户端同时调用两个端点(一个读取,一个写入)。
我知道在 Python 中多个线程实际上不会 运行 并发(由于 GIL),但是有一些 I/O 操作是异步的,这种情况会引起任何冲突?它的行为如何,我假设“赢得比赛”的请求将保留另一个请求(是吗)?
简而言之:你应该多想想你的休息 api 设计和实现某种 fifo 队列。
您必须有端点(W 用于写入,R 用于读取)。假设全局变量一开始有一些值 V0。如果客户端 A 从 R 读取,同时客户端 B 向 W 写入。可能会发生两种情况。
- 读取请求更快。客户端 A 将读取 V0.
- 写入请求更快。客户端 A 将阅读 V1.
由于您提到的 GIL,您不会 运行 进入不一致的内存状态,但是上述哪种情况发生是完全不可预测的。一次读取请求可能会稍快一些,而另一次写入请求可能会稍微快一些。许多请求处理是在您的操作系统中完成的(例如地址解析或 TCP 连接管理)。此外,请求可能会遍历您网络中的其他机器,例如路由器或交换机。所有这些事情都完全不受您的控制,并且可能会比写入请求稍微延迟读取请求,反之亦然。因此,您 运行 您的 REST 服务器有多少线程并不重要,return 值几乎是不可预测的。
如果确实需要有序的读写交互,可以将资源做成fifo队列。所以每次任何客户端读取时,它都会从队列中弹出第一个元素。每次任何客户端写入时,它都会将该元素推到队列的末尾。如果这样做,您可以保证不会因覆盖而丢失任何数据,并且您可以按照写入的相同顺序读取数据。
场景:假设我有一个用 Python 编写的 REST API(可能使用 Flask),它存储了一个全局变量。 API 有两个端点,一个读取变量和 returns 变量,另一个写入变量。现在,我有两个客户端同时调用两个端点(一个读取,一个写入)。
我知道在 Python 中多个线程实际上不会 运行 并发(由于 GIL),但是有一些 I/O 操作是异步的,这种情况会引起任何冲突?它的行为如何,我假设“赢得比赛”的请求将保留另一个请求(是吗)?
简而言之:你应该多想想你的休息 api 设计和实现某种 fifo 队列。
您必须有端点(W 用于写入,R 用于读取)。假设全局变量一开始有一些值 V0。如果客户端 A 从 R 读取,同时客户端 B 向 W 写入。可能会发生两种情况。
- 读取请求更快。客户端 A 将读取 V0.
- 写入请求更快。客户端 A 将阅读 V1.
由于您提到的 GIL,您不会 运行 进入不一致的内存状态,但是上述哪种情况发生是完全不可预测的。一次读取请求可能会稍快一些,而另一次写入请求可能会稍微快一些。许多请求处理是在您的操作系统中完成的(例如地址解析或 TCP 连接管理)。此外,请求可能会遍历您网络中的其他机器,例如路由器或交换机。所有这些事情都完全不受您的控制,并且可能会比写入请求稍微延迟读取请求,反之亦然。因此,您 运行 您的 REST 服务器有多少线程并不重要,return 值几乎是不可预测的。
如果确实需要有序的读写交互,可以将资源做成fifo队列。所以每次任何客户端读取时,它都会从队列中弹出第一个元素。每次任何客户端写入时,它都会将该元素推到队列的末尾。如果这样做,您可以保证不会因覆盖而丢失任何数据,并且您可以按照写入的相同顺序读取数据。