Отменить операцию блокировки в Go

У меня есть блокирующая операция в сторонней библиотеке, которую я не контролирую. Это может потенциально продолжаться вечно. Поэтому я хочу установить тайм-аут на это. Очевидный способ - обернуть его каналом и горутином, а затем выбрать результат с помощью time.After, Однако проблема заключается в том, что выполнение процедуры блокировки потенциально может длиться вечно.

Вот пример, чтобы проиллюстрировать это http://repl.it/90o

Есть ли способ отменить рутину или собрать мусор?

2 ответа

Решение

Вы не можете остановить goroutine от "снаружи". Программа должна поддерживать какую-то сигнализацию завершения (чаще всего канал). Но если это не так, вы не можете заставить или убить его.

Если вы ничего не можете сделать с используемой вами сторонней библиотекой, самое большее, что вы можете сделать, - это запустить ее в другом процессе (в другом приложении, запущенном вашим приложением go), который вы можете уничтожить, но это просто уродливый и слишком громоздкий.

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

Другие вопросы по тегам