Bug #20413
Updated by ioquatix (Samuel Williams) about 1 month ago
Using `Enumerator` in the event loop can cause problems as the fiber created by `rb_fiber_new` is blocking by default. It should be non-blocking.
```ruby
#!/usr/bin/env ruby
require 'async'
Async do
Async do
while true
puts "Hello"
sleep 1
end
end
enumerator = Enumerator.new do |yielder|
while true
yielder << "World"
sleep 1
end
end
while true
puts enumerator.next
end
end
```
Before this PR, the output is:
```
> ./test.rb
Hello
World
World
World
World
World
World
...
```
After this PR, the output is:
```
> ./test.rb
Hello
World
Hello
World
Hello
World
Hello
World
Hello
World
...
```
The reason why this happens, is because the enumerator `sleep` never yields to the event loop.
See <https://github.com/ruby/ruby/pull/10481> for the fix.