summaryrefslogtreecommitdiff
path: root/ractor.rb
AgeCommit message (Collapse)Author
2025-12-22[DOC] Improve ractor class docs (grammar, code examples) (#15686)Luke Gruber
2025-12-18Update ArgumentError message for Ractor.selectJohn Hawthorn
2025-12-18[DOC] Update ractor.rb docsJohn Hawthorn
2025-12-18[DOC] small improvements to ractor class docs (#15584)Luke Gruber
* Ractor.yield no longer exists * Ractor.shareable_proc returns a copy of the given proc * Improve wording for monitoring/unmonitoring ports
2025-12-10Update Ractor warning messageJohn Hawthorn
Although the Ractor API is still experimental and may change, and there may be some implementation issues, we should no longer say that there are many. Hopefully we can remove this warning entirely for Ruby 4.1
2025-12-05fix typo s/sharable/shareable/Koichi Sasada
2025-12-04Ractor.store_if_absent should not warnKoichi Sasada
```ruby $VERBOSE = true Ractor.store_if_absent :key do end #=> warning: the block passed to 'Ractor.store_if_absent' defined at <internal:ractor>:474 may be ignored ```
2025-09-24Ractor.shareable_procKoichi Sasada
call-seq: Ractor.sharable_proc(self: nil){} -> sharable proc It returns shareable Proc object. The Proc object is shareable and the self in a block will be replaced with the value passed via `self:` keyword. In a shareable Proc, the outer variables should * (1) refer shareable objects * (2) be not be overwritten ```ruby a = 42 Ractor.shareable_proc{ p a } #=> OK b = 43 Ractor.shareable_proc{ p b; b = 44 } #=> Ractor::IsolationError because 'b' is reassigned in the block. c = 44 Ractor.shareable_proc{ p c } #=> Ractor::IsolationError because 'c' will be reassigned outside of the block. c = 45 d = 45 d = 46 if cond Ractor.shareable_proc{ p d } #=> Ractor::IsolationError because 'd' was reassigned outside of the block. ``` The last `d`'s case can be relaxed in a future version. The above check will be done in a static analysis at compile time, so the reflection feature such as `Binding#local_varaible_set` can not be detected. ```ruby e = 42 shpr = Ractor.shareable_proc{ p e } #=> OK binding.local_variable_set(:e, 43) shpr.call #=> 42 (returns captured timing value) ``` Ractor.sharaeble_lambda is also introduced. [Feature #21550] [Feature #21557]
2025-09-01remove `Ractor#take`Koichi Sasada
[Feature #21262]
2025-08-04[DOC] Fill undocumented documentsNobuyoshi Nakada
2025-07-17fix obsolete doc with `Ractor::Port`Koichi Sasada
2025-06-09s/sned/sendzzak
2025-06-04`Ractor#take` and warnKoichi Sasada
`Ractor#take` was deprecated but some libraries can use it as an alias for `Ractor#value` (i.e., to wait for a Ractor's temrination and retrieve its result). Therefore `Ractor#take` is simply an alias for `Ractor#value`. This method will remain available until the end of August 2025, unless there is further discussion. Notes: Merged: https://github.com/ruby/ruby/pull/13512
2025-05-31`Ractor::Port`Koichi Sasada
* Added `Ractor::Port` * `Ractor::Port#receive` (support multi-threads) * `Rcator::Port#close` * `Ractor::Port#closed?` * Added some methods * `Ractor#join` * `Ractor#value` * `Ractor#monitor` * `Ractor#unmonitor` * Removed some methods * `Ractor#take` * `Ractor.yield` * Change the spec * `Racotr.select` You can wait for multiple sequences of messages with `Ractor::Port`. ```ruby ports = 3.times.map{ Ractor::Port.new } ports.map.with_index do |port, ri| Ractor.new port,ri do |port, ri| 3.times{|i| port << "r#{ri}-#{i}"} end end p ports.each{|port| pp 3.times.map{port.receive}} ``` In this example, we use 3 ports, and 3 Ractors send messages to them respectively. We can receive a series of messages from each port. You can use `Ractor#value` to get the last value of a Ractor's block: ```ruby result = Ractor.new do heavy_task() end.value ``` You can wait for the termination of a Ractor with `Ractor#join` like this: ```ruby Ractor.new do some_task() end.join ``` `#value` and `#join` are similar to `Thread#value` and `Thread#join`. To implement `#join`, `Ractor#monitor` (and `Ractor#unmonitor`) is introduced. This commit changes `Ractor.select()` method. It now only accepts ports or Ractors, and returns when a port receives a message or a Ractor terminates. We removes `Ractor.yield` and `Ractor#take` because: * `Ractor::Port` supports most of similar use cases in a simpler manner. * Removing them significantly simplifies the code. We also change the internal thread scheduler code (thread_pthread.c): * During barrier synchronization, we keep the `ractor_sched` lock to avoid deadlocks. This lock is released by `rb_ractor_sched_barrier_end()` which is called at the end of operations that require the barrier. * fix potential deadlock issues by checking interrupts just before setting UBF. https://bugs.ruby-lang.org/issues/21262 Notes: Merged: https://github.com/ruby/ruby/pull/13445
2025-05-13Throw RuntimeError if getting/setting ractor local storage for non-main ractorlukeg
[Bug #19367] Notes: Merged: https://github.com/ruby/ruby/pull/7174
2025-04-07Use correct warn methodKanstantsin Shautsou
Notes: Merged: https://github.com/ruby/ruby/pull/13079
2025-03-31Correct typo in Ractor commentLorenzo Zabot
Notes: Merged: https://github.com/ruby/ruby/pull/13011
2025-01-02[DOC] Exclude 'Class' and 'Module' from RDoc's autolinkingNobuyoshi Nakada
Notes: Merged: https://github.com/ruby/ruby/pull/12496
2024-12-25[DOC] Ractor::RemoteErrorNobuyoshi Nakada
Notes: Merged: https://github.com/ruby/ruby/pull/12467
2024-12-21Properly document Ractor#require (#12389)Victor Shepelev
Notes: Merged-By: zverok <zverok.offline@gmail.com>
2024-12-16FIx Ractor.main? to return `true` not `0`Jean Boussier
[Bug #20954] Notes: Merged: https://github.com/ruby/ruby/pull/12352
2024-12-13followup 0bdb38ba6be208064a514c12a9b80328645689f8Koichi Sasada
(forgot to amend...) Notes: Merged: https://github.com/ruby/ruby/pull/12331
2024-12-13`Ractor.set_if_absent(key)`Koichi Sasada
to initialize ractor local storage in thread-safety. [Feature #20875] Notes: Merged: https://github.com/ruby/ruby/pull/12321
2024-11-08support `require` in non-main RactorsKoichi Sasada
Many libraries should be loaded on the main ractor because of setting constants with unshareable objects and so on. This patch allows to call `requore` on non-main Ractors by asking the main ractor to call `require` on it. The calling ractor waits for the result of `require` from the main ractor. If the `require` call failed with some reasons, an exception objects will be deliverred from the main ractor to the calling ractor if it is copy-able. Same on `require_relative` and `require` by `autoload`. Now `Ractor.new{pp obj}` works well (the first call of `pp` requires `pp` library implicitly). [Feature #20627] Notes: Merged: https://github.com/ruby/ruby/pull/11142
2024-11-08`Ractor.[]` and `Ractor.[]=`Koichi Sasada
`Ractor#[]/[]=` is only for accessors to the current ractor, so that `Ractor.[]/[]=` is simpler. [Feature #20715] Notes: Merged: https://github.com/ruby/ruby/pull/11142
2024-11-08`Ractor.main?`Koichi Sasada
to return the current ractor is the main ractor. (== `Ractor.current == Ractor.main`) Notes: Merged: https://github.com/ruby/ruby/pull/11142
2023-12-16remove `Ractor::Selector` from Ruby levelKoichi Sasada
`Ractor::Selector` is not approved by Matz so remove it from Ruby-level. The implementation is used by `Ractor.select` so most of implementation was remaind and calling `rb_init_ractor_selector()`, `Ractor::Selector` will be defined. I will provide `ractor-selector` gem to try it.
2023-03-03`Ractor::Selector#empty?`Koichi Sasada
It returns the waiting set is empty or not. Also add Ractor::Selector's tests. Notes: Merged: https://github.com/ruby/ruby/pull/7417
2023-03-02Rewrite Ractor synchronization mechanismKoichi Sasada
This patch rewrites Ractor synchronization mechanism, send/receive and take/yield. * API * Ractor::Selector is introduced for lightweight waiting for many ractors. * Data structure * remove `struct rb_ractor_waiting_list` and use `struct rb_ractor_queue takers_queue` to manage takers. * remove `rb_ractor_t::yield_atexit` and use `rb_ractor_t::sync::will_basket::type` to check the will. * add `rb_ractor_basket::p.take` to represent a taking ractor. * Synchronization protocol * For the Ractor local GC, `take` can not make a copy object directly so ask to generate the copy from the yielding ractor. * The following steps shows what `r1.take` does on `r0`. * step1: (r0) register `r0` into `r1`'s takers. * step2: (r0) check `r1`'s status and wakeup r0 if `r1` is waiting for yielding a value. * step3: (r0) sleep until `r1` wakes up `r0`. * The following steps shows what `Ractor.yield(v)` on `r1`. * step1: (r1) check first takers of `r1` and if there is (`r0`), make a copy object of `v` and pass it to `r0` and wakes up `r0`. * step2: (r1) if there is no taker ractors, sleep until another ractor try to take. Notes: Merged: https://github.com/ruby/ruby/pull/7371
2023-02-27Fix spelling (#7389)John Bampton
Notes: Merged-By: k0kubun <takashikkbn@gmail.com>
2023-01-29[DOC] Make changes to docs in ractor.rb (#7180)Luke Gruber
* Make changes to docs in ractor.rb Mainly English changes to make things more clear, and to fix minor non-idiomatic phrases. Also clarified difference between frozen and shareable objects. * More minor changes to Ractor docs. Notes: Merged-By: zzak <zzakscott@gmail.com>
2022-10-26[Bug #19081] Show the caller location in warning for RactorNobuyoshi Nakada
The internal location in ractor.rb is not usefull at all. ``` $ ruby -e 'Ractor.new {}' <internal:ractor>:267: warning: Ractor is experimental, ... ``` Notes: Merged: https://github.com/ruby/ruby/pull/6629 Merged-By: nobu <nobu@ruby-lang.org>
2022-08-28[DOC] Correct article of Ractor's introduction [ci skip]Felix Yan
Notes: Merged: https://github.com/ruby/ruby/pull/6293 Merged-By: nobu <nobu@ruby-lang.org>
2022-07-28Fix conversion of `rb_ractor_id()`Nobuyoshi Nakada
2021-09-15[DOC] Fix broken links [ci skip]Nobuyoshi Nakada
* As the "doc/" prefix is specified by the `--page-dir` option, remove from the rdoc references. * Refer to the original .rdoc instead of the converted .html.
2021-09-05Replace RBOOL macroS-H-GAMELINKS
Notes: Merged: https://github.com/ruby/ruby/pull/4791
2021-04-26Fix some typos by spell checkerRyuta Kamizono
Notes: Merged: https://github.com/ruby/ruby/pull/4414
2021-01-10Fix ractor docs (#4048) [doc]Tom Chen
Notes: Merged-By: marcandre <github@marc-andre.ca>
2020-12-24Add call-seq to Ractor doc; improve wording [doc]Marc-Andre Lafortune
Notes: Merged: https://github.com/ruby/ruby/pull/3992
2020-12-22[DOC] Fix typo in Ractor.make_shareable documentation.nagachika
2020-12-22fix ractor's doc. [ci skip]Koichi Sasada
Notes: Merged: https://github.com/ruby/ruby/pull/3960
2020-12-22add Ractor.mainKoichi Sasada
It returns main Ractor, like Thread.main. [Feature #17418] Notes: Merged: https://github.com/ruby/ruby/pull/3963
2020-12-22add Ractor#[]/#[]= for ractor local storageKoichi Sasada
This API is similar to plain old Thread#[]/Fiber#[] interface with symbol key. Notes: Merged: https://github.com/ruby/ruby/pull/3962
2020-12-21Ractor#to_s as #inspectMarc-Andre Lafortune
2020-12-22separate rb_ractor_pub from rb_ractor_tKoichi Sasada
separate some fields from rb_ractor_t to rb_ractor_pub and put it at the beggining of rb_ractor_t and declare it in vm_core.h so vm_core.h can access rb_ractor_pub fields. Now rb_ec_ractor_hooks() is a complete inline function and no MJIT related issue. Notes: Merged: https://github.com/ruby/ruby/pull/3943
2020-12-21rename to rb_ractor_make_shareable_copy()Koichi Sasada
from rb_ractor_make_copy_shareable().
2020-12-20Adjusted indents of closing braces [ci skip]Nobuyoshi Nakada
2020-12-20fix indentKoichi Sasada
2020-12-19Add documentation for Ractor (#3895)Victor Shepelev
Notes: Merged-By: marcandre <github@marc-andre.ca>
2020-12-19Strip trailing spaces [ci skip]Nobuyoshi Nakada