[#112638] [Ruby master Bug#19470] Frequent small range-reads from and then writes to a large array are very slow — "giner (Stanislav German-Evtushenko) via ruby-core" <ruby-core@...>

Issue #19470 has been reported by giner (Stanislav German-Evtushenko).

8 messages 2023/03/01

[#112664] [Ruby master Bug#19473] can't be called from trap context (ThreadError) is too limiting — "Eregon (Benoit Daloze) via ruby-core" <ruby-core@...>

Issue #19473 has been reported by Eregon (Benoit Daloze).

28 messages 2023/03/02

[#112681] [Ruby master Misc#19475] Propose Matthew Valentine-House (@eightbitraptor) as a core committer — "k0kubun (Takashi Kokubun) via ruby-core" <ruby-core@...>

SXNzdWUgIzE5NDc1IGhhcyBiZWVuIHJlcG9ydGVkIGJ5IGswa3VidW4gKFRha2FzaGkgS29rdWJ1

11 messages 2023/03/03

[#112744] [Ruby master Bug#19485] Unexpected behavior in squiggly heredocs — "jemmai (Jemma Issroff) via ruby-core" <ruby-core@...>

Issue #19485 has been reported by jemmai (Jemma Issroff).

9 messages 2023/03/08

[#112746] [Ruby master Bug#19518] Recent Source Releases Do Not Compile on CentOS 7 Due to configure Script Error Generated By autoconf >= 2.70 — "eviljoel (evil joel) via ruby-core" <ruby-core@...>

Issue #19518 has been reported by eviljoel (evil joel).

7 messages 2023/03/08

[#112770] [Ruby master Feature#19520] Support for `Module.new(name)` and `Class.new(superclass, name)`. — "ioquatix (Samuel Williams) via ruby-core" <ruby-core@...>

Issue #19520 has been reported by ioquatix (Samuel Williams).

42 messages 2023/03/09

[#112773] [Ruby master Feature#19521] Support for `Module#name=` and `Class#name=`. — "ioquatix (Samuel Williams) via ruby-core" <ruby-core@...>

Issue #19521 has been reported by ioquatix (Samuel Williams).

31 messages 2023/03/09

[#112818] [Ruby master Misc#19525] DevMeeting-2023-04-13 — "mame (Yusuke Endoh) via ruby-core" <ruby-core@...>

Issue #19525 has been reported by mame (Yusuke Endoh).

8 messages 2023/03/10

[#112871] [Ruby master Bug#19529] [BUG] ObjectSpace::WeakMap can segfault after compaction — "byroot (Jean Boussier) via ruby-core" <ruby-core@...>

Issue #19529 has been reported by byroot (Jean Boussier).

12 messages 2023/03/14

[#112926] [Ruby master Misc#19535] Instance variables order is unpredictable on objects with `OBJ_TOO_COMPLEX_SHAPE_ID` — "byroot (Jean Boussier) via ruby-core" <ruby-core@...>

Issue #19535 has been reported by byroot (Jean Boussier).

8 messages 2023/03/17

[#112933] [Ruby master Feature#19538] Performance warnings — "byroot (Jean Boussier) via ruby-core" <ruby-core@...>

Issue #19538 has been reported by byroot (Jean Boussier).

11 messages 2023/03/17

[#112944] [Ruby master Feature#19541] Proposal: Generate frame unwinding info for YJIT code — "kjtsanaktsidis (KJ Tsanaktsidis) via ruby-core" <ruby-core@...>

SXNzdWUgIzE5NTQxIGhhcyBiZWVuIHJlcG9ydGVkIGJ5IGtqdHNhbmFrdHNpZGlzIChLSiBUc2Fu

13 messages 2023/03/19

[#113033] [Ruby master Feature#19555] Allow passing default options to `Data.define` — "p8 (Petrik de Heus) via ruby-core" <ruby-core@...>

Issue #19555 has been reported by p8 (Petrik de Heus).

7 messages 2023/03/28

[#113045] [Ruby master Feature#19559] Introduce `Symbol#+@` and `Symbol#-@`, and eventually replace boolean arguments with symbols — "sawa (Tsuyoshi Sawada) via ruby-core" <ruby-core@...>

Issue #19559 has been reported by sawa (Tsuyoshi Sawada).

20 messages 2023/03/30

[#113059] [Ruby master Bug#19563] Ripper.tokenize(code).join != code when heredoc and multiline %w[] literal is on the same line — "tompng (tomoya ishida) via ruby-core" <ruby-core@...>

Issue #19563 has been reported by tompng (tomoya ishida).

6 messages 2023/03/31

[ruby-core:112659] [Ruby master Feature#19472] Ractor::Selector to wait multiple ractors

From: "ioquatix (Samuel Williams) via ruby-core" <ruby-core@...>
Date: 2023-03-02 07:13:42 UTC
List: ruby-core #112659
Issue #19472 has been updated by ioquatix (Samuel Williams).


Is it compatible with fiber scheduler?

----------------------------------------
Feature #19472: Ractor::Selector to wait multiple ractors
https://bugs.ruby-lang.org/issues/19472#change-102107

* Author: ko1 (Koichi Sasada)
* Status: Open
* Priority: Normal
* Assignee: ko1 (Koichi Sasada)
* Target version: 3.3
----------------------------------------
This ticket propose `Ractor::Selector` API to wait multiple ractor events.

Now, if we want to wait for taking from r1, r2 and r3, we can use `Ractor.select()` like that.


```ruby
r, v = Ractor.select(r1, r2, r3)
p "taking an object #{v} from #{r}"
```

With proposed `Ractor::Selector` API, we can write the following:

```ruby
selector = Ractor.selector.new(r1, r2) # make a waiting set with r1 and r2
selector.add(r3) # we can add r3 to the waiting set after that.
selector.add(r4)
selector.remove(r4) # we can remove r4 from the waiting set.

r, v = selector.wait
p "taking an object #{v} from #{r}"
```

* `Ractor::Selector.new(*ractors)`: create a selector
* `Ractor::Selector#add(r)`: add `r` to the waiting list
* `Ractor::Selector#remove(r)`: remove `r` from the waiting list
* `Ractor::Selector#clear`: remove all ractors from the waiting list
* `Ractor::Selector#wait`: wait for the ractor events

https://github.com/ruby/ruby/pull/7371/files#diff-2be07f7941fed81f90e2947cdd9a91a5775d0c94335e8332b4805d264380b255R380

The advantages comparing with `Ractor.select` are:

* (1) (API design) We can preset the waiting set before waiting. Providing unified way to manage waiting list seems better.
* (2) (Performance) It is lighter than passing an array object to the `Ractor.select(*rs)` if `rs` is bigger and bigger.

For (2), it is important to supervise thousands of ractors.

`Ractor::Selector#wait` also has additional features:

* `wait(receive: true)` also waits receiving.
  * `Ractor.select(*rs, Ractor.current)` does same, but I believe `receive: true` keyword is more direct to understand.
* `wait(yield_value: obj, move: true/false)` also waits yielding.
  * Same as `Ractor.select(yield_value: obj, move: true/false)`
* If a ractor `r` is closing, then `#wait` removes `r` automatically.
* If there is no waiting ractors, it raises an exception (now `Ractor::Error` is raised but it should be a better exception class)

With automatic removing, we can write the code to wait n tasks.

```ruby
rs = n.times.map{ Ractor.new{ do_task } }
selector = Ractor::Selector.new(*rs)

loop do
  r, v = selector.wait
  handle_answers(r, v)
rescue Ractor::Error
  p :all_tasks_done
end
```

Without auto removing, we can write the following code.

```ruby
rs = n.times.map{ Ractor.new{ do_task } }
selector = Ractor::Selector.new(*rs)

loop do
  r, v = selector.wait
  handle_answers(r, v)
rescue Ractor::ClosedError => e
  selector.remove e.ractor
rescue Ractor::Error
  p :all_tasks_done
end

# or on this case worker ractors only yield one value (at exit) so the following code works as well.

loop do
  r, v = selector.wait
  handle_answers(r, v)
  selector.remove r
rescue Ractor::Error
  p :all_tasks_done
end

``` 

I already merged it but I want to discuss about the spec.

Discussion:

* The name `Selector` is acceptable?
* Auto-removing seems convenient but it can hide the behavior.
  * allow auto-removing
  * allow auto-removing as configurable option
    * per ractor or per selector
    * which is default?
  * disallow auto-removing
* What happens on no taking ractors
  * raise an exception (which exception?)
  * return nil simply

maybe and more...




-- 
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/

In This Thread