async icon indicating copy to clipboard operation
async copied to clipboard

[Question] How to stop a fiber?

Open jsaak opened this issue 2 years ago • 4 comments

I have still no idea how to stop a Fiber from running (unschedule). I was told that i can raise an exception, but it is not working as i hoped. Can you help me how to do that?

In this code i was expecting @fib1 to exit, but it does not exit ever.

Do I have any alternative options?

require 'async'

Fiber.set_scheduler(Async::Scheduler.new)

@fib1 = Fiber.schedule do
  puts 'entering fiber 1'
  sleep 1
  @fib2.raise
  puts 'exiting fiber 1'
end

@fib2 = Fiber.schedule do
  puts 'entering fiber 2'
  begin
    sleep 4
  rescue
    puts 'got exception'
  end
  puts 'exiting fiber 2'
end

jsaak avatar Jul 26 '23 11:07 jsaak

reading the source of Task, i found this:

Fiber.scheduler.raise(@fib2, "Stop")

And it seems to be working fine. Any reason Fiber.raise works different?

jsaak avatar Jul 26 '23 11:07 jsaak

The problem with Fiber.raise is that it doesn't know how to schedule the original fiber that called it and it does an implicit transfer.

We should probably fix this in Ruby itself, so that it just works as expected.

Let me look into this issue in more detail this week.

ioquatix avatar Jul 26 '23 11:07 ioquatix

Thanks! I am happy that you think it is a bug too. In the meantime i will use Fiber.scheduler.raise() .

(My program is a bit more complicated than the one i posted, i lost some hair figuring this out :)

jsaak avatar Jul 26 '23 11:07 jsaak

If you check Fiber.scheduler.raise you will see it handles the scheduling correctly.

ioquatix avatar Jul 26 '23 11:07 ioquatix