particle_pool 0.1.1 → 0.1.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/Gemfile.lock +1 -1
- data/README.md +1 -45
- data/bin/test-pool.rb +56 -10
- data/lib/particle_pool.rb +2 -1
- data/lib/particle_pool/box.rb +47 -0
- data/lib/particle_pool/pool.rb +9 -4
- data/lib/particle_pool/pool_thread.rb +9 -6
- data/lib/particle_pool/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5d7d654c37d60427a15c1124ea54a033238802156368e9c663d37ef43eff26cf
|
4
|
+
data.tar.gz: a61d02e0285ddd57c913a84adbb06bdcee3ea5921b8bea434ebb0380421f654e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8ccc3eec762cad7a76e05bd3f3836210d714f0bcaf0559298d6a3aabff2384d1f56f2821b507208b004c376263351ac1b101b155acc0064ed4b3cee477539808
|
7
|
+
data.tar.gz: add0d9f2773a637132d2f64560021b50fb534cc1e67ed7ffa0be444eb0dfc85ceba1434df28b643d0d934955304ed790566fbd0cdd43bbe62777384c5b685fe9
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -18,51 +18,7 @@ Or install it yourself as:
|
|
18
18
|
|
19
19
|
## Usage
|
20
20
|
|
21
|
-
|
22
|
-
# Require the library
|
23
|
-
require 'particle_pool'
|
24
|
-
|
25
|
-
# Create a new pool
|
26
|
-
p = ParticlePool::Pool.new
|
27
|
-
|
28
|
-
# Start it
|
29
|
-
p.start
|
30
|
-
|
31
|
-
(1024 * Etc.nprocessors).times do |i|
|
32
|
-
# Create some tasks
|
33
|
-
t = ParticlePool::Task.new do |n|
|
34
|
-
raise 'fib not defined for negative numbers' if n < 0
|
35
|
-
nv, ov = 1, 0
|
36
|
-
n.times do
|
37
|
-
nv, ov = nv + ov, nv
|
38
|
-
Fiber.yield
|
39
|
-
end
|
40
|
-
$arr << ov
|
41
|
-
$sz += 1
|
42
|
-
ov
|
43
|
-
end
|
44
|
-
|
45
|
-
# And push them into the pool.
|
46
|
-
p.push(t, i)
|
47
|
-
end
|
48
|
-
|
49
|
-
# You can wait for tasks to finish!
|
50
|
-
t = ParticlePool::Task.new do
|
51
|
-
sleep 16
|
52
|
-
'Hello, World!'
|
53
|
-
end
|
54
|
-
p.push(t)
|
55
|
-
|
56
|
-
puts t.await_sync
|
57
|
-
|
58
|
-
# Wait for all results to appear
|
59
|
-
while $sz != (1024 * Etc.nprocessors) do
|
60
|
-
sleep 1
|
61
|
-
end
|
62
|
-
|
63
|
-
# Sum results and print the final result
|
64
|
-
puts $arr.reduce(:+)
|
65
|
-
```
|
21
|
+
You can find usage examples in the bin/ directory.
|
66
22
|
|
67
23
|
## Development
|
68
24
|
|
data/bin/test-pool.rb
CHANGED
@@ -6,12 +6,18 @@ require 'particle_pool'
|
|
6
6
|
load File.dirname(__FILE__) + '/task.rb'
|
7
7
|
|
8
8
|
p = ParticlePool::Pool.new
|
9
|
-
p.start
|
9
|
+
p.start 16
|
10
10
|
|
11
|
-
|
12
|
-
|
11
|
+
Result = Struct.new(:sz, :arr)
|
12
|
+
Sum = Struct.new(:sz, :sum)
|
13
13
|
|
14
|
-
|
14
|
+
res = Result.new
|
15
|
+
res.sz = 0
|
16
|
+
res.arr = []
|
17
|
+
|
18
|
+
resbox = ParticlePool::Box.new res
|
19
|
+
|
20
|
+
2048.times do |i|
|
15
21
|
t = ParticlePool::Task.new do |n|
|
16
22
|
raise 'fib not defined for negative numbers' if n < 0
|
17
23
|
nv, ov = 1, 0
|
@@ -19,8 +25,8 @@ $arr = []
|
|
19
25
|
nv, ov = nv + ov, nv
|
20
26
|
Fiber.yield
|
21
27
|
end
|
22
|
-
|
23
|
-
|
28
|
+
res.arr << ov
|
29
|
+
res.sz += 1
|
24
30
|
ov
|
25
31
|
end
|
26
32
|
|
@@ -33,10 +39,50 @@ t = ParticlePool::Task.new do
|
|
33
39
|
end
|
34
40
|
p.push(t)
|
35
41
|
|
36
|
-
|
42
|
+
t2 = ParticlePool::Task.new do
|
43
|
+
puts t.await
|
44
|
+
end
|
45
|
+
p.push(t2)
|
37
46
|
|
38
|
-
|
39
|
-
|
47
|
+
abox = ParticlePool::Box.new
|
48
|
+
t3 = ParticlePool::Task.new do
|
49
|
+
sleep 20
|
50
|
+
abox.value = 'asdf'
|
51
|
+
end
|
52
|
+
p.push(t3)
|
53
|
+
|
54
|
+
t4 = ParticlePool::Task.new do
|
55
|
+
puts abox.await
|
56
|
+
end
|
57
|
+
p.push(t4)
|
58
|
+
|
59
|
+
sum = Sum.new
|
60
|
+
sum.sz = 0
|
61
|
+
sum.sum = 0
|
62
|
+
sumbox = ParticlePool::Box.new sum
|
63
|
+
|
64
|
+
tres = ParticlePool::Task.new do
|
65
|
+
resbox.await_block do
|
66
|
+
resbox.value.sz == 2048
|
67
|
+
end
|
68
|
+
|
69
|
+
resbox.value.arr.each do |i|
|
70
|
+
t = ParticlePool::Task.new do
|
71
|
+
sumbox.value.sz += 1
|
72
|
+
sumbox.value.sum += i
|
73
|
+
end
|
74
|
+
p.push(t)
|
75
|
+
end
|
76
|
+
|
77
|
+
sumbox.await_block do
|
78
|
+
sumbox.value.sz == 2048
|
79
|
+
end
|
80
|
+
|
81
|
+
puts sumbox.value.sum
|
40
82
|
end
|
83
|
+
p.push(tres)
|
41
84
|
|
42
|
-
|
85
|
+
while sumbox.value.sz != 2048 do
|
86
|
+
sleep 1
|
87
|
+
end
|
88
|
+
sleep 2
|
data/lib/particle_pool.rb
CHANGED
@@ -0,0 +1,47 @@
|
|
1
|
+
class ParticlePool::Box
|
2
|
+
attr_accessor :value, :extra
|
3
|
+
|
4
|
+
def initialize(value = nil)
|
5
|
+
@value = value
|
6
|
+
@extra = nil
|
7
|
+
end
|
8
|
+
|
9
|
+
def await(s=0.01)
|
10
|
+
until @value
|
11
|
+
Fiber.yield
|
12
|
+
sleep(s)
|
13
|
+
end
|
14
|
+
@value
|
15
|
+
end
|
16
|
+
|
17
|
+
def await_sync(s=0.01)
|
18
|
+
sleep(s) until @value
|
19
|
+
@value
|
20
|
+
end
|
21
|
+
|
22
|
+
def await_for(v, s=0.01)
|
23
|
+
until @value == v
|
24
|
+
Fiber.yield
|
25
|
+
sleep(s)
|
26
|
+
end
|
27
|
+
@value
|
28
|
+
end
|
29
|
+
|
30
|
+
def await_for_sync(v, s=0.01)
|
31
|
+
sleep(s) until @value == v
|
32
|
+
@value
|
33
|
+
end
|
34
|
+
|
35
|
+
def await_block(s=0.01, &b)
|
36
|
+
until b.()
|
37
|
+
Fiber.yield
|
38
|
+
sleep(s)
|
39
|
+
end
|
40
|
+
@value
|
41
|
+
end
|
42
|
+
|
43
|
+
def await_block_sync(s=0.01, &b)
|
44
|
+
sleep(s) until b.()
|
45
|
+
@value
|
46
|
+
end
|
47
|
+
end
|
data/lib/particle_pool/pool.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
class ParticlePool::Pool
|
2
2
|
def initialize
|
3
|
-
@
|
3
|
+
@mtx = Mutex.new
|
4
|
+
@threads = []
|
5
|
+
@round_robin = false
|
6
|
+
@iter = @threads.each
|
4
7
|
end
|
5
8
|
|
6
9
|
def <<(t, *args, **kwargs)
|
@@ -8,9 +11,11 @@ class ParticlePool::Pool
|
|
8
11
|
end
|
9
12
|
|
10
13
|
def push(t, *args, **kwargs)
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
+
@mtx.synchronize do
|
15
|
+
thr = @threads.min
|
16
|
+
raise 'no threads available' unless t
|
17
|
+
thr.push(t, *args, **kwargs)
|
18
|
+
end
|
14
19
|
end
|
15
20
|
|
16
21
|
def start(size = Etc.nprocessors)
|
@@ -5,6 +5,7 @@ class ParticlePool::PoolThread
|
|
5
5
|
|
6
6
|
def initialize
|
7
7
|
@queue = Queue.new
|
8
|
+
@mtx = Mutex.new
|
8
9
|
@tasks = 0
|
9
10
|
end
|
10
11
|
|
@@ -13,12 +14,14 @@ class ParticlePool::PoolThread
|
|
13
14
|
end
|
14
15
|
|
15
16
|
def push(t, *args, **kwargs)
|
16
|
-
@
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
17
|
+
@mtx.synchronize do
|
18
|
+
@tasks += 1
|
19
|
+
@queue << {
|
20
|
+
task: t,
|
21
|
+
args: args,
|
22
|
+
kwargs: kwargs
|
23
|
+
}
|
24
|
+
end
|
22
25
|
end
|
23
26
|
|
24
27
|
def <=>(other)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: particle_pool
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nickolay Ilyushin
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-07-
|
11
|
+
date: 2018-07-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -58,6 +58,7 @@ files:
|
|
58
58
|
- bin/test-task.rb
|
59
59
|
- bin/test-thread.rb
|
60
60
|
- lib/particle_pool.rb
|
61
|
+
- lib/particle_pool/box.rb
|
61
62
|
- lib/particle_pool/pool.rb
|
62
63
|
- lib/particle_pool/pool_thread.rb
|
63
64
|
- lib/particle_pool/task.rb
|