
Issue #20413 has been updated by k0kubun (Takashi Kokubun). Backport changed from 3.0: UNKNOWN, 3.1: REQUIRED, 3.2: REQUIRED, 3.3: REQUIRED to 3.0: UNKNOWN, 3.1: REQUIRED, 3.2: REQUIRED, 3.3: DONE ruby_3_3 commit:5688bcb54a640b353bed4ff49032ea00f947e1aa merged revision(s) commit:5d1702e01a36e11b183fe29ce10780a9b1a41cf0. ---------------------------------------- Bug #20413: Enumerator can block fiber scheduler. https://bugs.ruby-lang.org/issues/20413#change-108501 * Author: ioquatix (Samuel Williams) * Status: Closed * Assignee: ioquatix (Samuel Williams) * Backport: 3.0: UNKNOWN, 3.1: REQUIRED, 3.2: REQUIRED, 3.3: DONE ---------------------------------------- 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.
--
https://bugs.ruby-lang.org/