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

31 просмотр

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

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

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

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

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Ребят в СИ можно реализовать ООП?
Николай
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
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
1
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Всем привет, нужна как никогда, нужна помощь с IO в загрузчике. Пишу в code16 после установки сегментных регистров, пишу вывод символа. Пробовал 2 варианта: # 1 mov $0x0E, %a...
Shadow Akira
14
Карта сайта