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 ответов

34 просмотра

а как 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
То и означает. Тебе всё, что ответ сервер, прилети...

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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта