silent_worker 0.1.1 → 0.2.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 80d7a8fb43c309b68d209965410868524c497689
4
- data.tar.gz: c3ba3f235cd1afe51e3c857b56b7268a26c7a614
3
+ metadata.gz: 73bc5d82b300cd804ce3001b57f386755d868ca7
4
+ data.tar.gz: 2cc6e8bbf5c0cd9e7415a5a9bbff7386ead2a754
5
5
  SHA512:
6
- metadata.gz: 9f84945e8e958909e5eb92c80ef343812cd43a196c94813eaf91f428e04698f83bfcbce4fee8d87e813115097b9783cbd32291000908812aafd249ec58d428ee
7
- data.tar.gz: 09e195ebf3cfd72d7eb6f2cd3dc2449746944a63fe942d35f500f8cc214aec613635a5ffa1a2d37db8150953da1238d90d1c913352773d882d6f1c90e3774b8b
6
+ metadata.gz: 41a03163ed2afd3e83c7906ffa57dd631c0486e2b548b86c21691e404d7afcb840bc4ab318ceafff59fc62e013de54531b8ac50e39e8a9f2a4e5e5320ba87d96
7
+ data.tar.gz: f9d1b47f994058f7d6a0c3518ec59c992c3b8781dd76c7d5ff563adc7c7c4626b39c52992d475a1cb1b8c203a518fd59ab367117070c11f83012ff8a99d28c74
@@ -2,4 +2,4 @@ language: ruby
2
2
  rvm:
3
3
  - 1.9.3
4
4
  - 2.0.0
5
- script: "bundle exec rspec -f d -c"
5
+ script: "TRAVIS_CI=true bundle exec rspec -f d -c"
data/README.md CHANGED
@@ -57,12 +57,12 @@ sw = SilentWorker.new(parallel) do |url|
57
57
  system("wget", url)
58
58
  end
59
59
 
60
- File.open('url_list.txt') do |f|
61
- sw << f.gets.strip
60
+ File.open('url_list.txt').each_line do |line|
61
+ sw << line.strip
62
62
  end
63
63
 
64
- File.open('url_list2.txt') do |f|
65
- sw << f.gets.strip
64
+ File.open('url_list2.txt').each_line do |line|
65
+ sw << line.strip
66
66
  end
67
67
 
68
68
  sw.wait
@@ -11,35 +11,39 @@ class SilentWorker
11
11
  @workers = workers
12
12
  @threads = []
13
13
  @queue = Queue.new
14
+ setup_signal_traps
14
15
  start
15
16
  end
16
17
 
17
18
  def <<(data)
18
- @queue.push(data)
19
+ @queue.enq(data)
19
20
  end
20
21
 
21
22
  def wait
22
23
  finish!
23
- @workers.times do
24
- @queue.push(FINISH_DATA)
25
- end
26
- @threads.each(&:join)
24
+ @threads.find_all(&:alive?).each(&:join)
27
25
  end
28
26
 
29
27
  def abort
30
28
  @threads.each(&:kill)
31
29
  wait
32
30
  end
31
+ alias :stop! :abort
33
32
 
34
33
  def stop
35
- wait
34
+ finish!
36
35
  end
37
36
 
38
37
  def start
39
- @workers.times do
40
- @threads << Thread.start(@job, @queue) do |job, queue|
38
+ return if @working
39
+
40
+ @working = true
41
+ @finished = false
42
+ @workers.times do |n|
43
+ @threads << Thread.start(@job, @queue, n) do |job, queue, n|
44
+ Thread.current[:num] = n
41
45
  loop do
42
- data = queue.pop
46
+ data = queue.deq
43
47
  break if @finished && data == FINISH_DATA
44
48
  job.call(data)
45
49
  end
@@ -50,7 +54,27 @@ class SilentWorker
50
54
  private
51
55
 
52
56
  def finish!
53
- @finished = true
57
+ @working = false
58
+
59
+ unless @finished
60
+ @finished = true
61
+ @workers.times do
62
+ @queue.enq(FINISH_DATA)
63
+ end
64
+ end
65
+ end
66
+
67
+ def setup_signal_traps
68
+ Signal.trap("INT") { abort }
69
+ Signal.trap("TERM") { abort }
70
+ Signal.trap("QUIT") { abort }
71
+
72
+ # Maybe forgotten to call #wait
73
+ Signal.trap("EXIT") do
74
+ return if @finished
75
+ warn "\nWARNING: You should call SilentWorker#wait to wait jobs are completed. Now abort them.\n"
76
+ abort
77
+ end
54
78
  end
55
79
 
56
80
  end
@@ -1,3 +1,3 @@
1
1
  class SilentWorker
2
- VERSION = "0.1.1"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -43,12 +43,13 @@ describe SilentWorker do
43
43
  describe "#stop and #start" do
44
44
  let(:sw) { SilentWorker.new {|data| data } }
45
45
 
46
- after { sw.abort }
46
+ after { sw.abort; sw.queue.clear }
47
47
 
48
48
  it "jobs won't be fired when stopping workers" do
49
49
  sw << 1
50
50
  sw.stop
51
51
  sw << 2
52
+ sw.wait
52
53
  sw.queue.pop.should == 2
53
54
  end
54
55
 
@@ -57,10 +58,37 @@ describe SilentWorker do
57
58
  sw << 1
58
59
  sw.stop
59
60
  sw << 2
61
+ sw.wait
60
62
  sw.queue.length.should == 1
63
+
61
64
  sw.start
62
65
  sw.wait
63
66
  sw.queue.length.should == 0
64
67
  end
65
68
  end
69
+
70
+ describe "Signal trapping" do
71
+ context "should abort" do
72
+ before do
73
+ sw = SilentWorker.new { sleep 10 }
74
+ sw.should_receive(:abort)
75
+ sleep 0.1 if ENV["TRAVIS_CI"]
76
+ end
77
+
78
+ it "INT" do
79
+ Process.kill("INT", $$)
80
+ end
81
+
82
+ it "TERM" do
83
+ Process.kill("TERM", $$)
84
+ end
85
+
86
+ it "QUIT" do
87
+ Process.kill("QUIT", $$)
88
+ end
89
+
90
+ it "EXIT", :pending => "How to test this?" do
91
+ end
92
+ end
93
+ end
66
94
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: silent_worker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - uu59
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-07-23 00:00:00.000000000 Z
11
+ date: 2013-07-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler