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

Добрый день, допустим, есть функция A, которая принимает контекст, запускает

горутину-генератор, возвращает два канала с данными и ошибками. Есть функция-горутина B, которая принимает контекст. Настройка пайплайна происходит в третьей функции main. Как сделать так, чтобы при возникновении ошибки в A все горутины B отменились? (В каком месте надо писать ctx.WithCancel ?)

15 ответов

14 просмотров

Имхо в мэйне. Мэйн же читает из канала A.errors? При получении ошибки, отменять контекст.

Джек Меридью
Ок, спасибо

Ну тут все зависит. Если в А происходит ошибка, то после записи в канал с ошибками, она закрывает оба канала? И с данными и с ошибками?

Джек-Меридью Автор вопроса
Джек Меридью
Тогда нужно еще передавать cancel в A?

Не обязательно. Можно отменить его в Main. После того как сработает <- A.errors

Джек-Меридью Автор вопроса
Vlad Tokarev
Не обязательно. Можно отменить его в Main. После т...

А, точно. Функция A да, завершается и закрывает все каналы при ошибке

Джек Меридью
А, точно. Функция A да, завершается и закрывает вс...

Ну вот. Следовательно в функции B канал с данными тоже окажется закрыт. Нужен ли в таком случае контекст вообще? Или достаточно обработать последний элемент данных, и на следующей итерации обнаружить канал с данными закрытым и завершиться

Vlad Tokarev
Ну вот. Следовательно в функции B канал с данными ...

В таком случае B которая обрабатывает данные, вообще не переживает по какой причине канал закрыт - закончились данные, или из-за ошибки. Ее задача обрабатывать данные пока канал с данными не закрыт. В свою очередь Main горутина является супервизором, и может зарепортить об ошибке, в producer’е через A.errors

Vlad Tokarev
В таком случае B которая обрабатывает данные, вооб...

Ну это как пример. Как общая рекомендация я бы избегал сложных и хитрых отмен контекста непонятно где. Очень сложно потом понять, что произошло и вообще читать такой код. Лучше всем таким заниматься в Main. Кмк

Джек-Меридью Автор вопроса
Vlad Tokarev
Ну это как пример. Как общая рекомендация я бы и...

А вообще, какая общая рекомендация, если есть k-уровневый пайплайн, функция main, ошибка на любом уровне влечет за собой отмену всей функции main?

Джек Меридью
А вообще, какая общая рекомендация, если есть k-ур...

Не могу сказать, я таких пайплайнов не писал у меня обычно максимум один продьюсер и 1:N консьюмеров. Надо конкретные примеры смотреть

в мейне. Контекст передаешь и в А и в B, если в А ошибка, то в ней вызывается cancel, который завершает все горутины в B

Джек Меридью
Типо передавать cancel в A?

если ты создаешь контекст внутри функции А, то ты не закроешь что-то снаружи функции А Можно не передавать, а ждать, если А вернет ошибку, то делать cancel

Джек-Меридью Автор вопроса

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
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
Карта сайта