Project

General

Profile

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.

Back