chantier 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.rdoc +11 -7
- data/chantier.gemspec +64 -0
- data/lib/chantier.rb +1 -1
- data/lib/process_pool.rb +14 -14
- data/lib/thread_pool.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 733102f569568fbb2f2953e74298840e6cddd625
|
4
|
+
data.tar.gz: 0753643bc032abc303a72f212dab29f7691338ec
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8b34b053dba7b457a0d4561c5fff71f14a8fa7e96314c0c9d209c539f874255da769ecd89b1fd96e4e8d1011c4dce4c4ef9b30ddbdd67f9ce8147e3396b93193
|
7
|
+
data.tar.gz: dd1101a603f7f83a28af4ebfd74734daadeecadeeef069987ced8947d5a73b5b527fda0a8f5040bd47409ecd39972b5a8d2e6b502f8f8813f942887fb160dff3
|
data/README.rdoc
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
= chantier
|
2
2
|
|
3
|
-
Dead-simple task manager for "fire and forget" jobs. Has two interchangeable pools - processes and threads
|
4
|
-
|
3
|
+
Dead-simple task manager for "fire and forget" jobs. Has two interchangeable pools - processes and threads. The API
|
4
|
+
of those two is the same, so you can play at will and figure out which one works better.
|
5
5
|
|
6
6
|
The only thing Chantier checks for is that the spun off tasks have completed. It also limits the number of tasks
|
7
7
|
active at the same time. Your code will block until a slot becomes available for a task.
|
@@ -15,17 +15,21 @@ active at the same time. Your code will block until a slot becomes available for
|
|
15
15
|
end
|
16
16
|
|
17
17
|
manager.block_until_complete! #=> Will block until all the subprocesses have terminated
|
18
|
-
|
19
|
-
If you have a finite Enumerable at hand you can also launch it into the ProcessPool, like so:
|
18
|
+
|
19
|
+
If you have a finite Enumerable at hand you can also launch it into the ProcessPool/ThreadPool, like so:
|
20
20
|
|
21
21
|
manager = Chantier::ThreadPool.new(slots = 4)
|
22
22
|
|
23
|
-
manager.map_fork(job_tickets) do | job_ticket |
|
24
|
-
# this block will run in a
|
25
|
-
Churner.new(
|
23
|
+
manager.map_fork(job_tickets) do | job_ticket | # job_tickets has to be an Enumerable
|
24
|
+
# this block will run in a thread
|
25
|
+
Churner.new(job_ticket).churn
|
26
26
|
...
|
27
27
|
end
|
28
28
|
|
29
|
+
Chantier does not provide any built-in IPC or inter-thread communication features - this should
|
30
|
+
stimulate you to write your tasks without them having to do IPC in the first place.
|
31
|
+
|
32
|
+
|
29
33
|
== Contributing to chantier
|
30
34
|
|
31
35
|
* Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.
|
data/chantier.gemspec
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = "chantier"
|
8
|
+
s.version = "0.0.2"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Julik Tarkhanov"]
|
12
|
+
s.date = "2014-07-15"
|
13
|
+
s.description = " Process your jobs in parallel with a simple table of processes or threads "
|
14
|
+
s.email = "me@julik.nl"
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"LICENSE.txt",
|
17
|
+
"README.rdoc"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
".document",
|
21
|
+
".rspec",
|
22
|
+
"Gemfile",
|
23
|
+
"LICENSE.txt",
|
24
|
+
"README.rdoc",
|
25
|
+
"Rakefile",
|
26
|
+
"chantier.gemspec",
|
27
|
+
"lib/chantier.rb",
|
28
|
+
"lib/process_pool.rb",
|
29
|
+
"lib/thread_pool.rb",
|
30
|
+
"spec/process_pool_spec.rb",
|
31
|
+
"spec/spec_helper.rb",
|
32
|
+
"spec/thread_pool_spec.rb"
|
33
|
+
]
|
34
|
+
s.homepage = "http://github.com/julik/chantier"
|
35
|
+
s.licenses = ["MIT"]
|
36
|
+
s.require_paths = ["lib"]
|
37
|
+
s.rubygems_version = "2.0.3"
|
38
|
+
s.summary = "Dead-simple worker table based multiprocessing/multithreading"
|
39
|
+
|
40
|
+
if s.respond_to? :specification_version then
|
41
|
+
s.specification_version = 4
|
42
|
+
|
43
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
44
|
+
s.add_development_dependency(%q<rspec>, ["~> 2.9"])
|
45
|
+
s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
|
46
|
+
s.add_development_dependency(%q<bundler>, ["~> 1.0"])
|
47
|
+
s.add_development_dependency(%q<jeweler>, ["~> 2.0.1"])
|
48
|
+
s.add_development_dependency(%q<simplecov>, [">= 0"])
|
49
|
+
else
|
50
|
+
s.add_dependency(%q<rspec>, ["~> 2.9"])
|
51
|
+
s.add_dependency(%q<rdoc>, ["~> 3.12"])
|
52
|
+
s.add_dependency(%q<bundler>, ["~> 1.0"])
|
53
|
+
s.add_dependency(%q<jeweler>, ["~> 2.0.1"])
|
54
|
+
s.add_dependency(%q<simplecov>, [">= 0"])
|
55
|
+
end
|
56
|
+
else
|
57
|
+
s.add_dependency(%q<rspec>, ["~> 2.9"])
|
58
|
+
s.add_dependency(%q<rdoc>, ["~> 3.12"])
|
59
|
+
s.add_dependency(%q<bundler>, ["~> 1.0"])
|
60
|
+
s.add_dependency(%q<jeweler>, ["~> 2.0.1"])
|
61
|
+
s.add_dependency(%q<simplecov>, [">= 0"])
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
data/lib/chantier.rb
CHANGED
data/lib/process_pool.rb
CHANGED
@@ -27,17 +27,17 @@
|
|
27
27
|
# Can be rewritten using Threads if operation on JVM/Rubinius will be feasible.
|
28
28
|
class Chantier::ProcessPool
|
29
29
|
# Kill the spawned processes after at most X seconds
|
30
|
-
KILL_AFTER_SECONDS = 60 * 2
|
30
|
+
# KILL_AFTER_SECONDS = 60 * 2
|
31
31
|
|
32
32
|
# http://linuxman.wikispaces.com/killing+me+softly
|
33
|
-
TERMINATION_SIGNALS = %w( TERM HUP INT QUIT PIPE KILL )
|
33
|
+
# TERMINATION_SIGNALS = %w( TERM HUP INT QUIT PIPE KILL )
|
34
34
|
|
35
35
|
# The manager uses loops in a few places. By doing a little sleep()
|
36
36
|
# in those loops we can yield process control back to the OS which brings
|
37
37
|
# the CPU usage of the managing process to small numbers. If you just do
|
38
38
|
# a loop {} MRI will saturate a whole core and not let go off of it until
|
39
39
|
# the loop returns.
|
40
|
-
SCHEDULER_SLEEP_SECONDS = 0
|
40
|
+
SCHEDULER_SLEEP_SECONDS = (1.0 / 1000)
|
41
41
|
|
42
42
|
def initialize(num_procs)
|
43
43
|
raise "Need at least 1 slot, given #{num_procs.to_i}" unless num_procs.to_i > 0
|
@@ -100,17 +100,17 @@ class Chantier::ProcessPool
|
|
100
100
|
# Dispatch the killer thread which kicks in after KILL_AFTER_SECONDS.
|
101
101
|
# Note that we do not manage the @pids table here because once the process
|
102
102
|
# gets terminated it will bounce back to the standard wait() above.
|
103
|
-
Thread.new do
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
end
|
103
|
+
# Thread.new do
|
104
|
+
# sleep KILL_AFTER_SECONDS
|
105
|
+
# begin
|
106
|
+
# TERMINATION_SIGNALS.each do | sig |
|
107
|
+
# Process.kill(sig, task_pid)
|
108
|
+
# sleep 5 # Give it some time to react
|
109
|
+
# end
|
110
|
+
# rescue Errno::ESRCH
|
111
|
+
# # It has already quit, nothing to do
|
112
|
+
# end
|
113
|
+
# end
|
114
114
|
end
|
115
115
|
|
116
116
|
# Tells whether some processes are still churning
|
data/lib/thread_pool.rb
CHANGED
@@ -32,7 +32,7 @@ class Chantier::ThreadPool
|
|
32
32
|
# the CPU usage of the managing process to small numbers. If you just do
|
33
33
|
# a loop {} MRI will saturate a whole core and not let go off of it until
|
34
34
|
# the loop returns.
|
35
|
-
SCHEDULER_SLEEP_SECONDS = 0
|
35
|
+
SCHEDULER_SLEEP_SECONDS = (1.0 / 500)
|
36
36
|
|
37
37
|
def initialize(num_threads)
|
38
38
|
raise "Need at least 1 slot, given #{num_threads.to_i}" unless num_threads.to_i > 0
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chantier
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Julik Tarkhanov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-07-
|
11
|
+
date: 2014-07-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -94,6 +94,7 @@ files:
|
|
94
94
|
- LICENSE.txt
|
95
95
|
- README.rdoc
|
96
96
|
- Rakefile
|
97
|
+
- chantier.gemspec
|
97
98
|
- lib/chantier.rb
|
98
99
|
- lib/process_pool.rb
|
99
100
|
- lib/thread_pool.rb
|