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

Привет, подскажите, как правильно выполнять работу на Го в несколько

потоков, когда есть список задач (который может пополняться). И надо предусмотреть завершение горутин.

Решение в лоб: запускаем X горутин с общим каналом, который будет прослушиваться, и задачи внутрь горутины будут поступать через него.

Как при этом сделать завершение горутин? Некрасивое решение в лоб: еще передать второй канал в горутину, внутри неё юзать select, а когда мы хотим все остановить - посылаем в неё количество сообщений по числу горутин. Каждая горутина при получении сообщения из стоп-канала просто закрывается, и её соседи берут следующие сообщения. Выглядит максимально грязно. Какие есть альтернативные решения?

11 ответов

23 просмотра

Посмотрите библиотеку context, может это то, что вам нужно

закрой общий канал

на самом деле это оч комплексная задача, и зависит от того, как именно горутины поддерживать, но в основновном можно обходиться context.Context, чаще всего это самый правильный способ. Но не всегда, например иногда необходимо передавать какие-нибудь данные в горутину, так что зависит от ситуации

Dmitry-🦆 Автор вопроса
Simon S
Посмотрите библиотеку context, может это то, что в...

Посмотрел, я так понимаю. что функция горутины внутри устроена так же, как и в моем примере, с селектом по двум каналам. Но при этом мне не надо просто самому явно в тот канал посылать определенное количество значений, спасибо.

Dmitry-🦆 Автор вопроса
Dmitry M
закрой общий канал

Хм, j, more := <-jobs выглядит еще проще

Если в горутине цикл range по каналу, то достаточно будет просто этот канал закрыть при завершении программы, цикл завершится и горутина тоже, но только когда в канале не останется элементов

Dmitry-🦆 Автор вопроса
v d
Если в горутине цикл range по каналу, то достаточн...

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

Dmitry-🦆 Автор вопроса
Richard Cooper
на самом деле это оч комплексная задача, и зависит...

А если мне надо иметь изменяемое число горутин для обработки очереди, то есть ли какие-то готовые решения, которые мне следует знать?

Dmitry 🦆
Ага, спасибо, в целом понял. Если мне надо будет б...

Тогда думаю можно обойтись и без контекста, будет более лаконично

Dmitry 🦆
А если мне надо иметь изменяемое число горутин для...

Запускайте, сколько надо, да и все Паттерн worker pool совсем не обязателен к применению

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

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

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