silent_worker 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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