U:RDoc::NormalClass[iI"
Fiber:ET@I"Object;To:RDoc::Markup::Document:@parts[o;;[o:RDoc::Markup::Paragraph;[
I"EFibers are primitives for implementing light weight cooperative ;TI"Mconcurrency in Ruby. Basically they are a means of creating code blocks ;TI"Lthat can be paused and resumed, much like threads. The main difference ;TI"Nis that they are never preempted and that the scheduling must be done by ;TI"#the programmer and not the VM.;To:RDoc::Markup::BlankLine o; ;[ I"OAs opposed to other stackless light weight concurrency models, each fiber ;TI"Jcomes with a stack. This enables the fiber to be paused from deeply ;TI"Dnested function calls within the fiber block. See the ruby(1) ;TI"9manpage to configure the size of the fiber stack(s).;T@o; ;[
I"KWhen a fiber is created it will not run automatically. Rather it must ;TI"Lbe explicitly asked to run using the Fiber#resume
method. ;TI"FThe code running inside the fiber can give up control by calling ;TI"MFiber.yield
in which case it yields control back to caller ;TI"3(the caller of the Fiber#resume
).;T@o; ;[I"JUpon yielding or termination the Fiber returns the value of the last ;TI"executed expression;T@o; ;[I"For instance:;T@o:RDoc::Markup::Verbatim;[
I"fiber = Fiber.new do
;TI" Fiber.yield 1
;TI" 2
;TI" end
;TI"
;TI"puts fiber.resume
;TI"puts fiber.resume
;TI"puts fiber.resume
;T:@format0o; ;[I"produces;T@o;;[I"1
;TI"2
;TI"#FiberError: dead fiber called
;T;0o; ;[ I"IThe Fiber#resume
method accepts an arbitrary number of ;TI"Jparameters, if it is the first call to resume
then they ;TI"Jwill be passed as block arguments. Otherwise they will be the return ;TI"2value of the call to Fiber.yield
;T@o; ;[I"
Example:;T@o;;[I""fiber = Fiber.new do |first|
;TI"& second = Fiber.yield first + 2
;TI" end
;TI"
;TI"puts fiber.resume 10
;TI"puts fiber.resume 14
;TI"puts fiber.resume 18
;T;0o; ;[I"produces;T@o;;[I"12
;TI"14
;TI""FiberError: dead fiber called;T;0:
@fileI"cont.c;T:0@omit_headings_from_table_of_contents_below0;
0;0[ [ [ [[I"
class;T[[:public[[I"current;TI"cont.c;T[I"
yield;T@a[:protected[ [:private[ [I"
instance;T[[;[[I"alive?;T@a[I"resume;T@a[I"
transfer;T@a[;[ [;[ [ [U:RDoc::Context::Section[i 0o;;[ ;
0;0[@U@UcRDoc::TopLevel