Прямо сейчас я делаю Процесс! Сообщение, но когда я погуглил немного, размер очереди сообщений, только ограничено памятью. У меня есть дерево процессов, где листы генерируют сообщения и канал до корня, и я должен ограничить очередь или переключиться на некоторый другой метод выполнения того же.
больше из него, иногда Процесс получает сообщения от одного листа и иногда от двух листов. Во втором случае мне нужны различные конечные очереди для eave листа.
Нити существуют, чтобы проще прославить работу нескольких агентов.
Если агенты - это пользователи, например, если у вас есть тема пользователя, они облегчают написать программу. Это не проблема с производительностью, это проблема с легкостью письма.
Если агенты - это устройства ввода / вывода, они облегчают написать программу, которая делает ввод / вывод в параллельной. Это может или не может быть сделано для производительности.
Если агенты являются процессорами CPU, они облегчают писать программы, которые получают несколько ядер, проводят параллельно. То есть когда потоки коррелируют с производительностью.
Другими словами, если вы думаете, что потоки == Parallelismish == Performance, это только ударяет одно из используемых потоков.
-121--3518769-Нет встроенных механизмов для ограничения размера очереди сообщений для процесса.
Обычное решение этой проблемы в Erlang - ввести протокол управления потоком между производителем и потребителем. Это может быть так же просто, как отправитель, ожидающий , продолжайте
Ответить перед отправкой следующего сообщения. Вы можете изобрести более сложные протоколы управления потоком (обмотка, ...), но часто отправляют / ждать-ответ сделают. Протокол Gen_Server: Call / 2
Протокол является хорошим протоколом ответа на запрос и может быть повторно использоваться, гнев по сможению в Gen_Server
и - Call
- Это заботится о многих краевых случаях, которые возможны.
Другой подход состоит в том, чтобы вытащить сообщения через систему вместо того, чтобы выталкивать их - в этом случае приемник просит отправителя для сообщения, когда он готов. Хотя, если у вас есть внешние производители, которые вы не можете достаточно ограничить или буфер, возможно, у вас может быть нет этой опции.
Классический способ обращения Ваш второй случай - включить PID
процесса отправки в сообщении. Это очень распространено для сообщений Erlang, которые обычно имеют структуру, аналогичную {SendingPid, Data}
. Это позволяет получить приему к обработке как посмотреть, кто отправил сообщение, так и с использованием сопоставления шаблонов в , получаю
, чтобы выбрать, из какого процесса, который он хочет получать сообщения.
Это то, как Erlang может мультировать сообщения от многих разных отправителей в одной очереди сообщений и не вынуждена обрабатывать все возможные сообщения везде.