timers 4.0.1 → 4.0.4
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/.travis.yml +1 -0
- data/CHANGES.md +13 -0
- data/Gemfile +0 -4
- data/README.md +7 -0
- data/lib/timers/events.rb +2 -1
- data/lib/timers/group.rb +15 -1
- data/lib/timers/version.rb +1 -1
- data/spec/every_spec.rb +15 -0
- data/spec/performance_spec.rb +38 -21
- metadata +9 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fc5b681c3922f53f0a1c332aad2955d61ee278a4
|
4
|
+
data.tar.gz: 4e90a800064db9f6cf1cdb4410cbb1ca8badd2ac
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fd8330e2dfd5b23813c55d242ad44d6c8d7c00e251a047f4206c72511132eeeb8fdf640fc2802a9e83e87dabab2134532dea10f25a993e9fd98fb9b759c3faca
|
7
|
+
data.tar.gz: 5e8d5e38d58ee3c7167dae55a293c5bf2a5cc6f84ea65edbba5435eafc8b85b31d2865f81cec97cdc8b612af4f87654fadc8a4da565822e61dc09e6756a65b05
|
data/.travis.yml
CHANGED
data/CHANGES.md
CHANGED
@@ -1,3 +1,16 @@
|
|
1
|
+
4.0.4 (2015-09-01)
|
2
|
+
------------------
|
3
|
+
* Re-release of the `4.1.1` version under the `4.0.4` designation to work-around issues caused by yanking `4.0.2` a couple weeks ago.
|
4
|
+
|
5
|
+
4.1.1 (2015-08-21)
|
6
|
+
------------------
|
7
|
+
* Remove `RubyProf` from Gemfile and a test, due to it providing no substantial benefit while increasing problems building bundles under Rubinius.
|
8
|
+
|
9
|
+
4.1.0 (2015-08-16)
|
10
|
+
------------------
|
11
|
+
* Addition of `now_and_every` method; fires block immediately, then sets recurring timer.
|
12
|
+
* Includes `now_and_after` method; does the same as above for one-shot timers: essentially a "two-shot" timer.
|
13
|
+
|
1
14
|
4.0.1 (2014-09-10)
|
2
15
|
------------------
|
3
16
|
* Memory leak fixes
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -50,6 +50,13 @@ every_five_seconds = timers.every(5) { puts "Another 5 seconds" }
|
|
50
50
|
loop { timers.wait }
|
51
51
|
```
|
52
52
|
|
53
|
+
You can also schedule a block to run immediately and periodically with `Timers::Group#now_and_every`:
|
54
|
+
```ruby
|
55
|
+
now_and_every_five_seconds = timers.now_and_every(5) { puts "Now and in another 5 seconds" }
|
56
|
+
|
57
|
+
loop { timers.wait }
|
58
|
+
```
|
59
|
+
|
53
60
|
If you'd like another method to do the waiting for you, e.g. `Kernel.select`,
|
54
61
|
you can use `Timers::Group#wait_interval` to obtain the amount of time to wait. When
|
55
62
|
a timeout is encountered, you can fire all pending timers with `Timers::Group#fire`:
|
data/lib/timers/events.rb
CHANGED
@@ -72,6 +72,7 @@ module Timers
|
|
72
72
|
return handle
|
73
73
|
end
|
74
74
|
end
|
75
|
+
# @sequence.reverse.find { |handle| !handle.cancelled? }
|
75
76
|
end
|
76
77
|
|
77
78
|
# Returns the number of pending (possibly cancelled) events.
|
@@ -93,7 +94,7 @@ module Timers
|
|
93
94
|
def pop(time)
|
94
95
|
index = bisect_left(@sequence, time)
|
95
96
|
|
96
|
-
|
97
|
+
@sequence.pop(@sequence.size - index)
|
97
98
|
end
|
98
99
|
|
99
100
|
# Return the left-most index where to insert item e, in a list a, assuming
|
data/lib/timers/group.rb
CHANGED
@@ -38,12 +38,26 @@ module Timers
|
|
38
38
|
Timer.new(self, interval, false, &block)
|
39
39
|
end
|
40
40
|
|
41
|
+
# Call the given block immediately, and then after the given interval. The first
|
42
|
+
# argument will be the time at which the group was asked to fire timers for.
|
43
|
+
def now_and_after(interval, &block)
|
44
|
+
block.call
|
45
|
+
after(interval, &block)
|
46
|
+
end
|
47
|
+
|
41
48
|
# Call the given block periodically at the given interval. The first
|
42
49
|
# argument will be the time at which the group was asked to fire timers for.
|
43
50
|
def every(interval, recur = true, &block)
|
44
51
|
Timer.new(self, interval, recur, &block)
|
45
52
|
end
|
46
53
|
|
54
|
+
# Call the given block immediately, and then periodically at the given interval. The first
|
55
|
+
# argument will be the time at which the group was asked to fire timers for.
|
56
|
+
def now_and_every(interval, recur = true, &block)
|
57
|
+
block.call
|
58
|
+
every(interval, recur, &block)
|
59
|
+
end
|
60
|
+
|
47
61
|
# Wait for the next timer and fire it. Can take a block, which should behave
|
48
62
|
# like sleep(n), except that n may be nil (sleep forever) or a negative
|
49
63
|
# number (fire immediately after return).
|
@@ -61,7 +75,7 @@ module Timers
|
|
61
75
|
end
|
62
76
|
end
|
63
77
|
|
64
|
-
fire
|
78
|
+
return fire
|
65
79
|
end
|
66
80
|
|
67
81
|
# Interval to wait until when the next timer will fire.
|
data/lib/timers/version.rb
CHANGED
data/spec/every_spec.rb
CHANGED
@@ -16,4 +16,19 @@ RSpec.describe Timers::Group do
|
|
16
16
|
|
17
17
|
expect(result).to be == [:a, :c, :a, :a, :b, :d]
|
18
18
|
end
|
19
|
+
|
20
|
+
it "should fire immediately and then several times later" do
|
21
|
+
result = []
|
22
|
+
|
23
|
+
subject.every(0.7) { result << :a }
|
24
|
+
subject.every(2.3) { result << :b }
|
25
|
+
subject.now_and_every(1.3) { result << :c }
|
26
|
+
subject.now_and_every(2.4) { result << :d }
|
27
|
+
|
28
|
+
Timers::Wait.for(2.5) do |remaining|
|
29
|
+
subject.wait if subject.wait_interval < remaining
|
30
|
+
end
|
31
|
+
|
32
|
+
expect(result).to be == [:c, :d, :a, :c, :a, :a, :b, :d]
|
33
|
+
end
|
19
34
|
end
|
data/spec/performance_spec.rb
CHANGED
@@ -1,6 +1,4 @@
|
|
1
|
-
|
2
1
|
require 'spec_helper'
|
3
|
-
require 'ruby-prof' unless RUBY_PLATFORM =~ /java/
|
4
2
|
|
5
3
|
# Event based timers:
|
6
4
|
|
@@ -41,26 +39,8 @@ require 'ruby-prof' unless RUBY_PLATFORM =~ /java/
|
|
41
39
|
# Serviced 1142649 events in 11.194903921 seconds, 102068.70405115146 e/s.
|
42
40
|
|
43
41
|
RSpec.describe Timers::Group do
|
44
|
-
if defined? RubyProf
|
45
|
-
before(:each) do
|
46
|
-
# Running RubyProf makes the code slightly slower.
|
47
|
-
RubyProf.start
|
48
|
-
puts "*** Running with RubyProf reduces performance ***"
|
49
|
-
end
|
50
42
|
|
51
|
-
|
52
|
-
if RubyProf.running?
|
53
|
-
# file = arg.metadata[:description].gsub(/\s+/, '-')
|
54
|
-
|
55
|
-
result = RubyProf.stop
|
56
|
-
|
57
|
-
printer = RubyProf::FlatPrinter.new(result)
|
58
|
-
printer.print($stderr, min_percent: 1.0)
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
it "run efficiently" do
|
43
|
+
it "runs efficiently" do
|
64
44
|
result = []
|
65
45
|
range = (1..500)
|
66
46
|
duration = 2.0
|
@@ -80,4 +60,41 @@ RSpec.describe Timers::Group do
|
|
80
60
|
|
81
61
|
expect(subject.current_offset).to be_within(TIMER_QUANTUM).of(duration)
|
82
62
|
end
|
63
|
+
|
64
|
+
=begin
|
65
|
+
it "runs efficiently at high volume" do
|
66
|
+
results = []
|
67
|
+
range = (1..300)
|
68
|
+
groups = (1..20)
|
69
|
+
duration = 101
|
70
|
+
|
71
|
+
timers = []
|
72
|
+
@mutex = Mutex.new
|
73
|
+
start = Time.now
|
74
|
+
groups.each do |gi|
|
75
|
+
timers << Thread.new {
|
76
|
+
result = []
|
77
|
+
timer = Timers::Group.new
|
78
|
+
total = 0
|
79
|
+
range.each do |ri|
|
80
|
+
offset = ri.to_f / range.max
|
81
|
+
total += (duration / offset).floor
|
82
|
+
timer.every(ri.to_f / range.max, :strict) { result << ri }
|
83
|
+
end
|
84
|
+
timer.wait while result.size < total
|
85
|
+
@mutex.synchronize { results += result }
|
86
|
+
|
87
|
+
}
|
88
|
+
end
|
89
|
+
timers.each { |t| t.join }
|
90
|
+
finish = Time.now
|
91
|
+
|
92
|
+
rate = results.size.to_f / ( runtime = finish - start )
|
93
|
+
|
94
|
+
puts "Serviced #{results.size} events in #{runtime} seconds, #{rate} e/s; across #{groups.max} timers."
|
95
|
+
|
96
|
+
expect(runtime).to be_within(TIMER_QUANTUM).of(duration)
|
97
|
+
end
|
98
|
+
=end
|
99
|
+
|
83
100
|
end
|
metadata
CHANGED
@@ -1,24 +1,24 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: timers
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.0.
|
4
|
+
version: 4.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tony Arcieri
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-09-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: hitimes
|
15
|
+
type: :runtime
|
16
|
+
prerelease: false
|
15
17
|
requirement: !ruby/object:Gem::Requirement
|
16
18
|
requirements:
|
17
19
|
- - ">="
|
18
20
|
- !ruby/object:Gem::Version
|
19
21
|
version: '0'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
@@ -26,13 +26,13 @@ dependencies:
|
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
|
+
type: :development
|
30
|
+
prerelease: false
|
29
31
|
requirement: !ruby/object:Gem::Requirement
|
30
32
|
requirements:
|
31
33
|
- - ">="
|
32
34
|
- !ruby/object:Gem::Version
|
33
35
|
version: '0'
|
34
|
-
type: :development
|
35
|
-
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - ">="
|
@@ -40,13 +40,13 @@ dependencies:
|
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec
|
43
|
+
type: :development
|
44
|
+
prerelease: false
|
43
45
|
requirement: !ruby/object:Gem::Requirement
|
44
46
|
requirements:
|
45
47
|
- - "~>"
|
46
48
|
- !ruby/object:Gem::Version
|
47
49
|
version: 3.0.0
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
@@ -104,7 +104,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
104
104
|
version: '0'
|
105
105
|
requirements: []
|
106
106
|
rubyforge_project:
|
107
|
-
rubygems_version: 2.
|
107
|
+
rubygems_version: 2.4.8
|
108
108
|
signing_key:
|
109
109
|
specification_version: 4
|
110
110
|
summary: Schedule procs to run after a certain time, or at periodic intervals, using
|