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

Прямо сейчас я делаю Процесс! Сообщение, но когда я погуглил немного, размер очереди сообщений, только ограничено памятью. У меня есть дерево процессов, где листы генерируют сообщения и канал до корня, и я должен ограничить очередь или переключиться на некоторый другой метод выполнения того же.

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

5
задан Kara 23 April 2014 в 21:49
поделиться

2 ответа

Нити существуют, чтобы проще прославить работу нескольких агентов.

  • Если агенты - это пользователи, например, если у вас есть тема пользователя, они облегчают написать программу. Это не проблема с производительностью, это проблема с легкостью письма.

  • Если агенты - это устройства ввода / вывода, они облегчают написать программу, которая делает ввод / вывод в параллельной. Это может или не может быть сделано для производительности.

  • Если агенты являются процессорами CPU, они облегчают писать программы, которые получают несколько ядер, проводят параллельно. То есть когда потоки коррелируют с производительностью.

Другими словами, если вы думаете, что потоки == Parallelismish == Performance, это только ударяет одно из используемых потоков.

-121--3518769-

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

Обычное решение этой проблемы в Erlang - ввести протокол управления потоком между производителем и потребителем. Это может быть так же просто, как отправитель, ожидающий , продолжайте Ответить перед отправкой следующего сообщения. Вы можете изобрести более сложные протоколы управления потоком (обмотка, ...), но часто отправляют / ждать-ответ сделают. Протокол Gen_Server: Call / 2 Протокол является хорошим протоколом ответа на запрос и может быть повторно использоваться, гнев по сможению в Gen_Server и - Call - Это заботится о многих краевых случаях, которые возможны.

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

9
ответ дан 13 December 2019 в 05:35
поделиться

Классический способ обращения Ваш второй случай - включить PID процесса отправки в сообщении. Это очень распространено для сообщений Erlang, которые обычно имеют структуру, аналогичную {SendingPid, Data} . Это позволяет получить приему к обработке как посмотреть, кто отправил сообщение, так и с использованием сопоставления шаблонов в , получаю , чтобы выбрать, из какого процесса, который он хочет получать сообщения.

Это то, как Erlang может мультировать сообщения от многих разных отправителей в одной очереди сообщений и не вынуждена обрабатывать все возможные сообщения везде.

1
ответ дан 13 December 2019 в 05:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: