E.41. test_shm_mq

Модуль test_shm_mq представляет пример использования механизмов динамической общей памяти и очереди сообщений в общей памяти для синхронизации процесса, обслуживающего клиента, с одним или несколькими фоновыми рабочими процессами. Он не наделён какой-то полезной нагрузкой сам по себе, а является лишь демонстрацией использования этих механизмов и тестом их функционирования.

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

E.41.1. Функции

test_shm_mq(queue_size int8, message text,
            repeat_count int4 default 1, num_workers int4 default 1)
    RETURNS void

Эта функция передаёт и принимает сообщения синхронно. Процесс, обслуживающий пользователя, передаёт указанное сообщение первому фоновому рабочему процессу через очередь сообщений заданного размера (queue_size). Первый рабочий процесс посылает сообщение второму, если число рабочих процессов (num_workers) больше одного, и так далее. В конце концов последний рабочий процесс возвращает сообщение процессу, обслуживающему пользователя. Если число повторений (repeat_count) больше одного, обслуживающий процесс вновь передаёт сообщение первому рабочему процессу. Когда сообщение будет передано и получено всеми координирующими процессами заданное число (repeat_count) раз, обслуживающий процесс проверяет, совпадает ли окончательно полученное сообщение с отправленным изначально, и выдаёт ошибку, если это не так.

test_shm_mq_pipelined(queue_size int8, message text,
                      repeat_count int4 default 1, num_workers int4 default 1,
                      verify bool default true)
    RETURNS void

Эта функция передаёт одно сообщение заданное число (repeat_count) раз первому рабочему процессу через очередь заданного размера (queue_size). Затем эти сообщения передаются каждому рабочему процессу по порядку, опять же через очередь заданного размера. Наконец, последний рабочий процесс возвращает сообщения процессу, обслуживающему пользователя. Этот процесс выполняет передачу и приём в неблокирующем режиме, так что он может начать получать копии сообщений до того, как закончит передавать все копии сообщения. Аргумент verify определяет, будут ли полученные копии сообщения сравниваться с отправляемым сообщением. (Это занимает определённое время, так что имеет смысл отключить эту проверку при тестировании производительности.)