From: "k0kubun (Takashi Kokubun) via ruby-core" Date: 2024-05-29T22:43:49+00:00 Subject: [ruby-core:118074] [Ruby master Bug#20413] Enumerator can block fiber scheduler. 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 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/postorius/lists/ruby-core.ml.ruby-lang.org/