Postgres 如何在套接字协议方面支持异步(非块)运算符?
how does Postgres support async(non-block) operator in term of socket protocol?
我找不到任何文档来阐明 Postgres 如何在套接字协议级别处理异步非阻塞请求的请求-响应。
举个例子,建议在 pg-client 中只使用两个 query-sql,它们使用一个套接字连接到 pg-server。我想有两种方法可以处理异步操作:
- 客户端无法在第一个请求未响应之前发送第二个命令。
client socket1 server
-----query1---------->
<----response1--------
------query2--------->
<-----response1-------
- 套接字同时发送两个查询并通过唯一标志进行不同的响应。
client socket1 server
-------query1 + uid:msg1----->
-------query2 + uid:msg2----->
<------response2 + uid:msg2---
<------response1 + uid:msg1---
我认为这应该是将请求作为真正的异步进程处理的第二种方式,但我没有从 document 中找到任何资源。
问题:
- Postgres 处理异步套接字操作的是哪一个?
- 如果使用第一种方式,为什么?
在网络协议层面,不区分同步和异步模式。区别仅在于客户端 API 的工作方式。
在任何给定时间始终最多有一个语句处于活动状态。例如参见the documentation for the simple protocol,但对于扩展协议也是一样的。
不同之处在于客户端 API 的工作方式:
在同步模式下,客户端线程被阻塞,直到查询结果完成。
在异步模式下,发送查询后控制立即返回给客户端线程,客户端可以在等待服务器响应期间去做其他事情。它必须定期轮询套接字以检查结果是否已到达。然后它可以读取和处理结果。
如果你想同时运行两个语句,你必须使用两个数据库会话。
我找不到任何文档来阐明 Postgres 如何在套接字协议级别处理异步非阻塞请求的请求-响应。
举个例子,建议在 pg-client 中只使用两个 query-sql,它们使用一个套接字连接到 pg-server。我想有两种方法可以处理异步操作:
- 客户端无法在第一个请求未响应之前发送第二个命令。
client socket1 server
-----query1---------->
<----response1--------
------query2--------->
<-----response1-------
- 套接字同时发送两个查询并通过唯一标志进行不同的响应。
client socket1 server
-------query1 + uid:msg1----->
-------query2 + uid:msg2----->
<------response2 + uid:msg2---
<------response1 + uid:msg1---
我认为这应该是将请求作为真正的异步进程处理的第二种方式,但我没有从 document 中找到任何资源。 问题:
- Postgres 处理异步套接字操作的是哪一个?
- 如果使用第一种方式,为什么?
在网络协议层面,不区分同步和异步模式。区别仅在于客户端 API 的工作方式。
在任何给定时间始终最多有一个语句处于活动状态。例如参见the documentation for the simple protocol,但对于扩展协议也是一样的。
不同之处在于客户端 API 的工作方式:
在同步模式下,客户端线程被阻塞,直到查询结果完成。
在异步模式下,发送查询后控制立即返回给客户端线程,客户端可以在等待服务器响应期间去做其他事情。它必须定期轮询套接字以检查结果是否已到达。然后它可以读取和处理结果。
如果你想同时运行两个语句,你必须使用两个数据库会话。