LINUX.ORG.RU

erlang - как реализовать лимитирование очереди сообщений?


0

0

на данный момент я в программе усиленно делаю Process ! Message
но это неверно с той точки зрения что у меня может быть потенциально (и это достаточно реально) реально огромная куча сообщений.
причём, более того, могут быть два процесса которые шлют третьему сообщения. и тогда нужно чтобы было две очереди с лимитом, скажем в 100-200 сообщений (впрочем точное число не важно, главное не занять всю память).

Как посоветуете сделать?

★★★

Ответ на: комментарий от anonymous

умница, а ты не читал что по ссылкам?
там
1) говорится что нигде не написано какого размера эта очередь и это оставляется на откуп реализаторам
2) говорится что очевидного механизма лимитирования очереди нету

vahvarh ★★★
() автор топика

Сделай специальный процесс, который будет хранить очередь сообщений.

tailgunner ★★★★★
()

Мне просто интересно, сколько же процессов шлют твоему Process сообщения, чтобы сожрать всю память.

Сделай специальный процесс, который будет хранить очередь сообщений.

Ну и получится тоже самое, очередь будет скапливаться не в Process, а тут.

Не очень то что хочешь, но может все же поможет:
Можно в receive флашить очередь до максимально допустимых размеров ( lists:keyfind(message_queue_len,1,process_info(self())) ) Мне кажется, что Process получит управление хоть раз до того как закончится память.

arhibot
()
Ответ на: комментарий от arhibot

>> Сделай специальный процесс, который будет хранить очередь сообщений.

Ну и получится тоже самое, очередь будет скапливаться не в Process, а тут.

Всё получится. Естественно, нужна обратная связь - менеджер очереди получает запрос от клиента, смотрит, не слишком ли длинная очередь, и, если не слишком, отвечает клиенту «иди с богом». Или не отвечает, и клиент останавливается.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

>Естественно, нужна обратная связь - менеджер очереди получает запрос от клиента, смотрит, не слишком ли длинная очередь, и, если не слишком, отвечает клиенту «иди с богом». Или не отвечает, и клиент останавливается.
Насколько я понял ТС думает, что может забиться mailbox процесса и сожрать всю память, при этому процесс за это время ни разу не получит управления. При таком раскладе «процесс-очередь» не поможет.

lists:keyfind(message_queue_len,1,process_info(self()))

process_info(self(),message_queue_len).

arhibot
()
Ответ на: комментарий от arhibot

> Насколько я понял ТС думает, что может забиться mailbox процесса и сожрать всю память, при этому процесс за это время ни разу не получит управления. При таком раскладе «процесс-очередь» не поможет.

Насколько я понял, ты не понял моего предложения.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

ну да. если только делать «а можно вам засунуть?» «ааа... можно... ну тогда сую».
и соответственно «можешь сувать» выдавать только если очередь не заполнена. а иначе ждать и выдавать это после того как читатель спросит «есть чё?» уберя при этом из очереди элемент.

vahvarh ★★★
() автор топика
Ответ на: комментарий от vahvarh

> ну да. если только делать «а можно вам засунуть?» «ааа... можно... ну тогда сую».

Не-а. Сувать без разрешения, а разрешение спрашивать на то, чтобы высунуть :) Так можно обойтись и без очереди сообщений - просто вести счетчик запросов, которые в данный момент обрабатываются сервером.

tailgunner ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.