Project

General

Profile

Feature #3944

Add Fiber#root? method

Added by Mike Perham almost 6 years ago. Updated 4 months ago.

Status:
Feedback
Priority:
Normal
Assignee:
[ruby-core:32777]

Description

Since the root fiber is treated differently than other Fibers (e.g. you can't yield from the root), code which can optionally use fibers for high-performance IO (in my case, the Mysql2 driver) needs Fiber#root? to know when it can use Fibers to execute a query versus using a standard blocking call.

History

#1 Updated by Yui NARUSE almost 6 years ago

  • Status changed from Open to Assigned
  • Assignee set to Koichi Sasada

#2 [ruby-core:42778] Updated by Lin Jen-Shin over 4 years ago

Any progress on this?

#3 [ruby-core:45849] Updated by Koichi Sasada over 4 years ago

  • Description updated (diff)

Sorry for long absent.

I'm not sure why Fiber#root? is needed.
Could you give the examples?
I think if you don't use Fiber#root, then Fiber#root? is not needed.
And I can't understand why Fiber#root is needed.
(I think Fiber#root is for Fiber#transfer)

#4 [ruby-core:47641] Updated by Koichi Sasada about 4 years ago

  • Status changed from Assigned to Feedback

#5 [ruby-core:48560] Updated by Koichi Sasada almost 4 years ago

  • Target version set to Next Major
  • Status changed from Feedback to Assigned

#6 [ruby-core:53068] Updated by Julien A over 3 years ago

what is Next Major ? 3.0 ???
The issue was more than 2 years ago, after looking at the code the implementation should not be a challenge and yet nothing.
it is so depressing watching the ruby redmine seriously...

#7 [ruby-core:53071] Updated by Zachary Scott over 3 years ago

Julien please see ruby-core:45849 and also read up on the wiki: http://bugs.ruby-lang.org/projects/ruby/wiki/HowToRequestFeatures

#8 [ruby-core:57481] Updated by Koichi Sasada almost 3 years ago

  • Status changed from Assigned to Feedback

#9 [ruby-core:62708] Updated by jy j over 2 years ago

Fiber#root is useful.
For example, I want write a method, when under EM::Synchrony environment it should use EM::Synchrony call(in fact is async call, and writing in sync, power by fiber), and when under Fiber#root, it should use sync call, so I need detect whether current fiber is root fiber.

#10 [ruby-core:63037] Updated by Koichi Sasada over 2 years ago

(2014/05/23 15:17), jjyruby@gmail.com wrote:

For example, I want write a method, when under EM::Synchrony environment it should use EM::Synchrony call(in fact is async call, and writing in sync, power by fiber), and when under Fiber#root, it should use sync call, so I need detect whether current fiber is root fiber.

Could you break down the description?
I don't know EM::Synchrony.

Why you need to choose root or not root?

--
// SASADA Koichi at atdot dot net

#11 [ruby-core:74280] Updated by Victor Maslov 7 months ago

For example, the Facebook Graph API server accepts POST request to calculate smth heavy and returns id of the 'async job'. Then I GET status until it's "complete" and then I GET the actual result.

To process thousands of requests I call my method_that_gets_data from inside Fiber.new for each URL and cycle through them until they are done. Inside method_that_gets_data there are yeilds when doing the first POST and when status is not "complete", so I know when the fiber is done or I should just check another one.

Now I want to reuse the method_that_gets_data without fibers -- to know whether to yield or to work until done I need to know if I'm running inside Fiber or not.

#12 [ruby-core:75596] Updated by Nobuyoshi Nakada 4 months ago

  • Description updated (diff)

Couldn't anyone explain how the method will be used and why it will be necessary?
As far as I read, it sounds that it's EM specific and EM should take care of it.

#13 [ruby-core:75606] Updated by B Kelly 4 months ago

Nobuyoshi Nakada wrote:

Couldn't anyone explain how the method will be used and why it will be necessary?
As far as I read, it sounds that it's EM specific and EM should take care of it.

It might indeed be EM-specific.

I have an RPC library based around EventMachine and fibers. It needs to record
Fiber.current at the point EventMachine.run is called.

The library then uses RPC.on_em_fiber? (i.e. Fiber.current == @em_fiber)
to make necessary choices similar to those described by earlier posters.

If this is indeed equivalent to what earlier posters have requested, it does
seem like functionality that could be provided by EM or EM::Synchrony.

Regards,

Bill

#14 [ruby-core:75610] Updated by Victor Maslov 4 months ago

It might indeed be EM-specific.

I didn't use EM and not going to in the case I've described above.

Also available in: Atom PDF