Nano Hash - криптовалюты, майнинг, программирование

Почему `libpq` использует опрос, а не уведомление для выборки данных?

Я читаю libpq ссылку. Он имеет как синхронные, так и асинхронные методы. Но я обнаружил нечто странное.

Когда я вижу функцию PQsendQuery, кажется, что она отправляет запрос и немедленно возвращается. И я ожидал, что функция обратного вызова получит уведомление, но этого не было, и в руководстве сказано опросить доступность данных.

Я не понимаю, почему асинхронный метод написан в режиме опроса. В любом случае, поскольку libp является официальной реализацией клиента, я считаю, что для такого дизайна должна быть веская причина. Что это? Или мне не хватает правильных материалов обратного вызова, упомянутых где-то еще?

12.10.2013

  • Просто примечание на потом: libpq имеет функцию PQsocket, которая возвращает дескриптор файла для сокета. Чтобы получать уведомления о доступности данных, отслеживайте этот сокет с помощью системного API. (kqueue, libdispatch и т. д.) 16.10.2013
  • Теперь я наконец понял этот дизайн. Это просто разница между блокирующим и неблокирующим стилем, и форма API действительно не имеет значения для производительности. 03.12.2014

Ответы:


1

В модели выполнения однопоточной программы поток выполнения не может быть прерван данными, возвращающимися из асинхронного запроса или, в более общем случае, из сетевого сокета. Только сигналы (SIGTERM и друзья) могут прерывать поток, но сигналы не могут быть привязаны к поступающим данным.

Вот почему обратный вызов для получения уведомлений о входящих данных невозможен. Фрагмент кода в libpq, который был бы необходим для вызова обратного вызова, никогда не запустится, если ваш код его не вызывает. И если вам нужно вызвать его, это сводит на нет весь смысл обратного вызова.

Существуют библиотеки, такие как Qt, которые обеспечивают обратные вызовы, но они построены с нуля с основным циклом, который действует как обработчик событий. Пользовательский код организован в обратные вызовы, и возможна событийная обработка поступающих данных. Но в этом случае библиотека берет на себя ответственность за поток выполнения, то есть ее основной цикл опрашивает источники данных. Это просто перекладывает ответственность на другой фрагмент кода за пределами libpq.

13.10.2013
  • Кажется, libpq предназначен для однопоточной программы. Это нормально для производительности? 14.10.2013
  • @Eonil: любому сетевому клиенту придется ждать сокетов. libpq просто предоставляет это пользователю библиотеки, позволяя использовать libpq с существующими библиотеками событий, такими как libevent или Linux epoll. Это делает libpq намного более масштабируемым, чем это было бы с блокирующим клиентом (например, kegel.com/c10k .html#threaded), не тратя впустую потоки, ожидающие и ожидающие в базе данных. Так что да, это очень хорошо для производительности. 01.12.2013

  • 2

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

    http://www.postgresql.org/docs/9.3/static/libpq-events.html#LIBPQ-EVENTS-PROC

    PGEVT_RESULTCREATE

    Событие создания результата запускается в ответ на любую функцию выполнения запроса, которая создает результат, включая PQgetResult. Это событие будет запущено только после успешного создания результата.

    typedef struct { PGconn *conn; PGresult *результат; } PGEventResultCreate; При получении события PGEVT_RESULTCREATE указатель evtInfo должен быть приведен к PGEventResultCreate *. Conn — это соединение, используемое для генерации результата. Это идеальное место для инициализации любых instanceData, которые необходимо связать с результатом. В случае сбоя процедуры обработки события результат будет очищен, а ошибка будет распространена. Процедура обработки события не должна пытаться очистить объект результата PQ для себя. При возврате кода ошибки необходимо выполнить всю очистку, так как событие PGEVT_RESULTDESTROY отправлено не будет.

    12.10.2013
  • Это не меняет необходимости опроса после PQsendQuery. Если вы этого не сделаете, это событие никогда не будет запущено. 14.10.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..