Как Postgres поддерживает асинхронный c (неблокированный) оператор в терминах протокола сокетов? - PullRequest
0 голосов
/ 06 февраля 2020

Я не нашел ни одного документа, который бы разъяснил, как Postgres обрабатывает запрос-ответ для асинхронного c неблочного запроса на уровне протокола сокета.

В качестве примера, предложите только два запроса - sql в pg-клиенте, которые используют одно сокетное соединение с pg-сервером. Я предполагаю, что есть два способа обработки операции asy c:

  1. клиент не может отправить вторую команду до того, как первый запрос не ответит.
client   socket1       server
   -----query1---------->
   <----response1--------
   ------query2--------->
   <-----response1-------              
сокет отправляет два запроса в одно и то же время и отдельный ответ уникальным флагом.
client       socket1          server
   -------query1 + uid:msg1----->
   -------query2 + uid:msg2----->
   <------response2 + uid:msg2---
   <------response1 + uid:msg1---

Я думаю, что это должен быть второй способ обработки запроса как реального асинхронного c процесса, но я ' не могу найти ни одного ресурса из документа . Вопрос:

  1. Какой из них является Postgres дескриптор асин c операция сокета?
  2. Если использовать первый способ и почему?

1 Ответ

1 голос
/ 06 февраля 2020

На уровне сетевого протокола нет различия между синхронным и асинхронным режимами. Разница только в том, как работает клиентский API.

В каждый момент времени всегда активен не более одного оператора. См., Например, документацию для простого протокола , но для расширенного протокола он такой же.

Разница в том, как работает клиентский API:

  • В синхронном режиме поток клиента блокируется до тех пор, пока результат запроса не будет завершен.

  • В асинхронном режиме управление возвращается потоку клиента сразу после отправки запроса, и клиент может go и делать что-то еще, пока он ждет ответа сервера. Он должен регулярно опрашивать сокет, чтобы проверить, пришел ли результат. Затем он может прочитать и обработать результат.

Если вы хотите запустить два оператора одновременно, вам нужно использовать два сеанса базы данных.

...