169 похожих чатов

Всем привет! Столкнулся с поведением, которое не могу понять. Может

кто сталкивался с подобным.
Есть GenServer, у которого есть имплементация handle_cast(), который на вход принимает сообщение (обычная строка). В теле этого handle_cast генерируется процесс (обычный spawn/1) и pid этого процесса сохраняется в состоянии GenServer-а. Генерируемый процесс содержит всего всего одну строчку кода - вызов HTTPoison в режиме стрима с передачей полученной на вход строки в качестве аргумента и stream_to в виде pid данного GenServer-а.

Логика такая: в генсверере, через handle_cast генерим процесс на стрим данных, которые ловим через handle_info. Когда пропадает необходимость - убиваем сохраненный в состоянии процесс по pid-у.

В чем загвоздка: Когда spawn-ом генерится процесс - он не шлет данные в "родительский" GenServer. Но если внутри анонимной функции, передаваемой в spawn добавить
receive do
msg -> msg
end
То все работает.

Мб есть у кого понимание что это за ерунда такая?

8 ответов

8 просмотров

а как pid родителя передается

Дело в том, что процесс, который ты спавнишь, умирает, сразу после запуска стрима, убивая сам стрим вместе с собой. Этот receive заставляет его жить пока он сообщение не получит. Но ты какую-то странную вещь делаешь

DooDLeZz*- Автор вопроса
DooDLeZz*
А как было бы лучше на твой взгляд?

1. Не делать стрим через сообщения. Это серьёзный антипаттерн, потому что у такого подхода нет backpressure, и какой-нибудь сломанный сервер положит твоё приложение огромным ответом на 100500 сообщений, которые в память не поместятся и обработаться не успеют 2. Не пользоваться HTTPoison 3. Ну если ты всё-таки решил так сделать, то запускать стрим в самом генсервере

DooDLeZz*- Автор вопроса
Lama Lover
1. Не делать стрим через сообщения. Это серьёзный ...

1. Что означает "стрим через сообщения"? 2. Что лучшая альтернатива? Mint? И почему? 3. Нет, если есть концептуально более лучшие решения - эт даже лучше

DooDLeZz*
1. Что означает "стрим через сообщения"? 2. Что лу...

То и означает. Тебе всё, что ответ сервер, прилетит в процесс в виде сообщений, хочешь ты этого или нет. Если сообщения будут прилетать быстрее чем ты их обработаешь, у тебя сервер упадёт Да, выбирай лучше Finch или Mint или Req

DooDLeZz*- Автор вопроса
Lama Lover
То и означает. Тебе всё, что ответ сервер, прилети...

Как это можно решить (без добавления всяких месседж брокеров и тп)?

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

Обсуждают сегодня

@MrMiscipitlick А можешь макрос написать, который будет вычислять смещение относительно переданных меток? Просто .label1-.label2, и вернуть значение.
КТ315
35
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
Подобного рода ;Следующие три строки это директивы ассемблера, ;которые можно не задавать, т.к.работаем в Visual Studio. ;Символ ";" - это начало однострочного комментария ...
Егор Анелькин
3
Привет всем. появился вопрос. Разрабатываю сайт, в данный момент он запущен. Хостинг beget. Добавляю на сайт яндекс метрику с помощью полей client-settings (взято отсюда http...
Andrew
2
Подскажите, где смотреть результат выполнения программы? Код: ;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, станда...
Егор Анелькин
5
еще вопрос, допустим мы создадим char массив из 10 элементов и присвоим ему через сканф 10 символов. и выведем все символы. Хотел спросить последний элемент /0 будет включать...
Anthem
11
открыть папку в проводнике: 1 - ShellExecute 2 - ExecuteProcess 3 - OpenDocument что лучше выбрать?
Alexey Kulakov
12
Изменение типа с SomeException на String и правда удобней @cheese_hs . А вот такой вариант насколько некрасив еще? loadConfigDB :: IO (Either String ConfigDataBase) loadConfi...
Camara
7
Где в Астане можно купить мясо для шашлыков?
Dancing Іңұқәһүғө
21
Карта сайта