Project

stagnum

0.0
The project is in a healthy, maintained state
A stupid work thread pool
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
 Dependencies

Development

~> 1.0
 Project Readme

stagnum

A stupid Ruby worker pool based on Thread and Thread::Queue.

pool = Stagnum::Pool.new('pool-zero', 4)
  #
  # 4 worker threads to service the enqueued jobs

q = Stagnum::DoneQueue.new
  #
  # a queue shared by a group of jobs to enqueue

30.times do |i|

  pool.enqueue(q, { i: i }) do |d|

    sleep(rand)

    d[:tname] = Thread.current.name
  end
end

successes, failures = q.pop_all
  #
  # Stagnum::DoneQueue extends Thread::Queue
  # but has a #pop_all convenience method

pp successes
  #
  # ==>
  #
  # [[:success, {i: 0, tname: "pool-zero__0"}],
  #  [:success, {i: 3, tname: "pool-zero__3"}],
  #  [:success, {i: 1, tname: "pool-zero__1"}],
  #  [:success, {i: 2, tname: "pool-zero__2"}],
  #  [:success, {i: 7, tname: "pool-zero__2"}],
  #  [:success, {i: 5, tname: "pool-zero__3"}],
  #  [:success, {i: 9, tname: "pool-zero__3"}],
  #  [:success, {i: 6, tname: "pool-zero__1"}],
  #  [:success, {i: 4, tname: "pool-zero__0"}],
  #  [:success, {i: 8, tname: "pool-zero__2"}]]

One can use Thread::Queue instead of Stagnum::DoneQueue, but DoneQueue provides a #pop_all.

Stagnum::DoneQueue also has #on_success and #on_failure (and #on_pop methods:

pool = Stagnum::Pool.new('pool-zero', 4)

s, f = [], []

q = Stagnum::DoneQueue.new
q.on_success do |r|
  s << r
end
q.on_failure do |r|
  f << r
end

30.times do |i|

  pool.enqueue(q, { i: i }) do |d|
    sleep(rand)
    d[:tname] = Thread.current.name
  end
end

q.pop_all

# ...

LICENSE

MIT, see LICENSE.txt