отменить операцию блокировки в Go
У меня есть блокировка в сторонней библиотеке, которую я не контролирую. Это может потенциально уйти навсегда. Поэтому я хочу установить таймаут на нем. Очевидным способом является обернуть его каналом и goroutine, а затем выбрать результат с time.After
. Тем не менее, проблема в том, что goroutine, выполняющий операцию блокировки, может потенциально уйти навсегда.
Вот пример, чтобы проиллюстрировать это http://repl.it/90o
Есть ли способ отменить goroutine или собрать мусор?
- Запрос HTTP-клиента Java с заданным таймаутом
- Как запретить тайм-ауты соединений для большого импорта MySQL
- Внедрить общий тайм-аут C #
- Как установить тайм-аут для строки кода c #
- Как я могу остановить MySQL-запрос, если он занимает слишком много времени?
Вы не можете остановить горутин из «снаружи». Горотин должен поддерживать некоторую сигнализацию о завершении (чаще всего канал). Но если это не так, вы не можете заставить его или убить его.
Если вы ничего не можете сделать о том, что вы используете, вы можете использовать его в другом процессе (в другом приложении, запущенном вашим приложением), которое вы можете убить, но это просто уродливый и слишком громоздкий.
Я не думаю, что ты можешь что-то сделать. В Go вы не можете остановить горутин снаружи. Если вы не можете исправить эту библиотеку, и вы думаете, что она может блокироваться навсегда, тогда напишите новую, которую вы сможете контролировать.