handle_info () не может выполнять несколько вызовов одновременно - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть программа (приложение C ++), в которой несколько потоков вызывают функцию handle_info (), написанную в модуле erlang (genserver).

Замечено, что если поток-1 отправляет кучу сообщений(скажем, 1000) к этому handle_info (), и в то же время, если Thread-2 также отправляет 1 или 2 сообщения одновременно на handle_info (), наблюдается, что handle_info () выполняет сообщения, отправленные Thread-2 только когда он заканчивает сообщения, отправленные Thread-1.

Я прочитал, что handle_info () является асинхронным, но в этом случае я считаю, что он работает как синхронный метод.

Я делаю что-то не так?

Примечание:

  1. Thread-1 и Thread-2 порождаются одним и тем же модулем erlang, а функция потока - из приложений C ++.

  2. Функция потока вызывает handle_info () с использованием функции enif_send () (erl_nif.h).

1 Ответ

0 голосов
/ 06 февраля 2019

Замечено, что handle_info () выполняет сообщения, отправленные Thread-2, только когда он заканчивает сообщения, отправленные Thread-1.

Это звучит для меня как Thread-1отправляет все свои сообщения, прежде чем Thread-2 отправит какие-либо сообщения.Поведение gen_server OTP не использует выборочный прием для обработки сообщений, т. Е. Реализация не выполняет поиск в почтовом ящике сервера, пытаясь сопоставить шаблон приема с сообщением.Вместо этого gen_server обрабатывает каждое сообщение в почтовом ящике сервера последовательно, т. Е. В порядке поступления сообщений в почтовый ящик.

Целью такой схемы является предотвращение утечек памяти.Такие утечки происходят, когда необработанные сообщения накапливаются в почтовом ящике.gen_server:call/cast отправить сообщение, которое попадает в почтовый ящик сервера (или сигнал выхода преобразуется в сообщение и помещается в почтовый ящик сервера, или сокет вызывает размещение сообщения в почтовом ящике сервера, или кто-то отправляет сообщение непосредственносервер с !), и сервер обрабатывает сообщения в почтовом ящике в порядке их поступления.Для каждого сообщения сервер вызывает соответствующую функцию обратного вызова:

Mod:handle_call()
Mod:handle_cast()
Mod:handle_info()

в зависимости от формата сообщения и удаляет сообщение из почтового ящика.

...