Postgres 如何在套接字协议方面支持异步(非块)运算符?

how does Postgres support async(non-block) operator in term of socket protocol?

我找不到任何文档来阐明 Postgres 如何在套接字协议级别处理异步非阻塞请求的请求-响应。

举个例子,建议在 pg-client 中只使用两个 query-sql,它们使用一个套接字连接到 pg-server。我想有两种方法可以处理异步操作:

  1. 客户端无法在第一个请求未响应之前发送第二个命令。
client   socket1       server
   -----query1---------->
   <----response1--------
   ------query2--------->
   <-----response1-------              
  1. 套接字同时发送两个查询并通过唯一标志进行不同的响应。
client       socket1          server
   -------query1 + uid:msg1----->
   -------query2 + uid:msg2----->
   <------response2 + uid:msg2---
   <------response1 + uid:msg1---

我认为这应该是将请求作为真正的异步进程处理的第二种方式,但我没有从 document 中找到任何资源。 问题:

  1. Postgres 处理异步套接字操作的是哪一个?
  2. 如果使用第一种方式,为什么?

在网络协议层面,不区分同步和异步模式。区别仅在于客户端 API 的工作方式。

在任何给定时间始终最多有一个语句处于活动状态。例如参见the documentation for the simple protocol,但对于扩展协议也是一样的。

不同之处在于客户端 API 的工作方式:

  • 在同步模式下,客户端线程被阻塞,直到查询结果完成。

  • 在异步模式下,发送查询后控制立即返回给客户端线程,客户端可以在等待服务器响应期间去做其他事情。它必须定期轮询套接字以检查结果是否已到达。然后它可以读取和处理结果。

如果你想同时运行两个语句,你必须使用两个数据库会话。