Как я могу остановить волокно?

Допустим, у нас есть волокно с длительным циклом и с данным каналом таймаута, когда мы получаем сообщение, мы хотим остановить волокно и перезапустить его (или сделать что-то еще). Вот псевдокод:

# we have a timeout channel
fiber = spawn do 
  # long running task
  # note that I can't pass anything to the function to stop
  Something.run
end

fiber.stop if timeout.receive

1 ответ

Решение

В настоящее время нет способа остановить волокно снаружи.

Однако в #6450 есть предложение добавить Fiber#cancel который обеспечил бы метод для мягкого завершения волокна путем повышения CancelledException в контексте его выполнения при следующем возобновлении. Это все еще активное обсуждение, описывающее ваш сценарий использования, которое, несомненно, будет полезным для понимания.

Другим вариантом было бы жесткое уничтожение волокна, просто удалив его из планировщика. Это, однако, никогда не даст ему возможности очистить свои ресурсы и, вероятно, не то, что вы хотите. Официального API для этого пока нет.

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