У меня есть некоторые goroutine логики, как это:Как закрыть goroutine, который управляет логикой потока?
go func() {
do_things_0()
do_things_1()
do_things_2()
do_things_3()
...
...
}()
Когда служба получает запрос, он будет создавать такую goroutine. И goroutine, возможно, потребляет память и требует более 30 минут.
Иногда служба может заметить недостаток памяти, и ей необходимо прекратить работу некоторых горутов.
Мои вопросы:
- Как я могу прекратить goroutine в приведенном выше примере?
- Есть ли способ узнать используемую память каждого горутина?
Update
- Я читал другие SO ответы, которые goroutine не могут быть убиты за пределами
- Я полагаю, что послать сигнал в канал, обрабатываемого goroutine, чтобы сделать goroutine бросить это подходит только для
for loop based logics
. - Я искал некоторые рекомендации по закрытию goroutine для
flow based logics
.
1) Вы не можете (см. Ниже). 2) Нет никакого способа сделать это. Чтобы «остановить» goroutine, вы должны изобрести механизм, чтобы убить его снаружи (например, закрыв канал, обработанный для goroutine). – Volker
Вы не можете остановить/убить горутин. См. Соответствующий вопрос: [отменить операцию блокировки в Go] (http://stackoverflow.com/questions/28240133/cancel-a-blocking-operation-in-go) – icza
@Volker Я знаю, что я могу закрыть канал, чтобы сделать goroutine закрывается, но я полагаю, что это полезно только для goroutine, который запускает цикл, подобный логике. Я не нашел удобного способа закрыть горутин для такого гортана с потоком. – pengdu