throttler 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -3,20 +3,21 @@ Throttler
3
3
 
4
4
  [![travis] [1]] [2]
5
5
 
6
- Throttler rate-limits code execution across threads or processes on a server.
6
+ Throttler rate-limits code execution across threads, evented blocks, or
7
+ processes on a server.
7
8
 
8
9
  ![Mapplethorpe][3]
9
10
 
10
11
  Installation
11
12
  ------------
12
13
 
14
+ Throttler works only on platforms that support file locking.
15
+
13
16
  ```ruby
14
- # in your Gemfile
17
+ # Gemfile
15
18
  gem 'throttler'
16
19
  ```
17
20
 
18
- Throttler works only on platforms that support file locking.
19
-
20
21
  Usage
21
22
  -----
22
23
 
@@ -26,7 +27,6 @@ once every second per IP address.
26
27
  ```ruby
27
28
  class Scrape
28
29
  def self.perform(site, ip_address, *ids)
29
- # The block is syntactic sugar.
30
30
  Throttler.limit 1.0, site, ip_address do
31
31
  spider = Spider.new site, ip_address
32
32
  spider.scrape *ids
@@ -12,12 +12,13 @@ module Throttler
12
12
 
13
13
  begin
14
14
  throttle = Throttle.new namespace
15
- throttle.lock
15
+ throttle.strangle
16
16
  throttle.hold wait
17
17
  ensure
18
- throttle.unlock
18
+ throttle.release
19
19
  end
20
20
 
21
+ # Syntactic sugar.
21
22
  yield if block_given?
22
23
  end
23
24
  end
@@ -8,15 +8,6 @@ module Throttler
8
8
 
9
9
  def initialize(namespace)
10
10
  @namespace = namespace
11
- @file = File.open(path, File::RDWR|File::CREAT)
12
- end
13
-
14
- def lock
15
- @file.flock(File::LOCK_EX)
16
- end
17
-
18
- def path
19
- "#{self.class.tmp_dir}/.lock-#{@namespace}"
20
11
  end
21
12
 
22
13
  def hold(wait)
@@ -24,25 +15,37 @@ module Throttler
24
15
  timestamp!
25
16
  end
26
17
 
27
- def unlock
28
- @file.flock(File::LOCK_UN)
18
+ def release
19
+ @file.flock File::LOCK_UN
29
20
  @file.close
30
21
  end
31
22
 
23
+ def strangle
24
+ file.flock File::LOCK_EX
25
+ end
26
+
32
27
  private
33
28
 
29
+ def file
30
+ @file ||= File.open path, File::RDWR|File::CREAT
31
+ end
32
+
34
33
  def now
35
34
  Time.now.to_f
36
35
  end
37
36
 
37
+ def path
38
+ "#{self.class.tmp_dir}/.lock-#{@namespace}"
39
+ end
40
+
38
41
  def timestamp
39
- @file.rewind
40
- @file.gets.to_f
42
+ file.rewind
43
+ file.gets.to_f
41
44
  end
42
45
 
43
46
  def timestamp!
44
- @file.rewind
45
- @file.write now
47
+ file.rewind
48
+ file.write now
46
49
  end
47
50
  end
48
51
  end
@@ -1,4 +1,4 @@
1
1
  module Throttler
2
- VERSION = '0.3.0'
2
+ VERSION = '0.3.1'
3
3
  end
4
4
 
@@ -8,13 +8,29 @@ class Work
8
8
  end
9
9
  end
10
10
 
11
+ class WorkAsWell
12
+ def self.perform
13
+ Throttler.limit 0.1, 'foo'
14
+ end
15
+ end
16
+
11
17
  class ThrottlerTest < Test::Unit::TestCase
12
18
  def test_throttling
13
19
  time = Benchmark.realtime do
14
20
  11.times { Process.fork { Work.perform } }
15
21
  Process.waitall
16
22
  end
23
+ assert_equal 1, time.to_i
24
+ end
17
25
 
26
+ def test_namespace
27
+ time = Benchmark.realtime do
28
+ 11.times do
29
+ Process.fork { Work.perform }
30
+ Process.fork { WorkAsWell.perform }
31
+ end
32
+ Process.waitall
33
+ end
18
34
  assert_equal 1, time.to_i
19
35
  end
20
36
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: throttler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-03-16 00:00:00.000000000 Z
13
+ date: 2012-03-17 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rake
17
- requirement: &70196529042720 !ruby/object:Gem::Requirement
17
+ requirement: &70163640755900 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ~>
@@ -22,7 +22,7 @@ dependencies:
22
22
  version: 0.9.2
23
23
  type: :development
24
24
  prerelease: false
25
- version_requirements: *70196529042720
25
+ version_requirements: *70163640755900
26
26
  description: Throttler rate-limits code execution across threads or processes.
27
27
  email:
28
28
  - hakan.ensari@papercavalier.com