From: "nagachika (Tomoyuki Chikanaga) via ruby-core" Date: 2024-07-06T02:24:43+00:00 Subject: [ruby-core:118456] [Ruby master Bug#20413] Enumerator can block fiber scheduler. Issue #20413 has been updated by nagachika (Tomoyuki Chikanaga). Backport changed from 3.0: UNKNOWN, 3.1: REQUIRED, 3.2: REQUIRED, 3.3: DONE to 3.0: UNKNOWN, 3.1: REQUIRED, 3.2: DONE, 3.3: DONE Sorry, I accidentally handled a different ticket (#20414). ruby_3_2 commit:2f8f17e842666abb05ca522d6072c957fab0e12e merged revision(s) commit:5d1702e01a36e11b183fe29ce10780a9b1a41cf0. ---------------------------------------- Bug #20413: Enumerator can block fiber scheduler. https://bugs.ruby-lang.org/issues/20413#change-108970 * Author: ioquatix (Samuel Williams) * Status: Closed * Assignee: ioquatix (Samuel Williams) * Backport: 3.0: UNKNOWN, 3.1: REQUIRED, 3.2: DONE, 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 for the fix. -- https://bugs.ruby-lang.org/ ______________________________________________ ruby-core mailing list -- ruby-core@ml.ruby-lang.org To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/