Module: Rainbows::FiberPool
- Includes:
- Rainbows::Fiber::Base
- Defined in:
- lib/rainbows/fiber_pool.rb
Overview
A Fiber-based concurrency model for Ruby 1.9. This uses a pool of Fibers to handle client IO to run the application and the root Fiber for scheduling and connection acceptance.
This concurrency model is difficult to use with existing applications, lacks third-party support, and is thus NOT recommended.
The pool size is equal to the number of worker_connections
. Compared to the ThreadPool model, Fibers are very cheap in terms of memory usage so you can have more active connections. This model supports a streaming “rack.input” with lightweight concurrency. Applications are strongly advised to wrap all slow IO objects (sockets, pipes) using the Rainbows::Fiber::IO class whenever possible.
Instance Method Summary collapse
-
#worker_loop(worker) ⇒ Object
:nodoc:.
Instance Method Details
#worker_loop(worker) ⇒ Object
:nodoc:
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
# File 'lib/rainbows/fiber_pool.rb', line 21 def worker_loop(worker) # :nodoc: init_worker_process(worker) pool = [] worker_connections.times { Fiber.new { process(Fiber.yield) while pool << Fiber.current }.resume # resume to hit Fiber.yield so it waits on a client } Rainbows::Fiber::Base.setup(self.class, app) begin schedule do |l| fib = pool.pop or break # let another worker process take it if io = l.kgio_tryaccept fib.resume(io) else pool << fib end end rescue => e Rainbows::Error.listen_loop(e) end while Rainbows.cur_alive end |