concurrent-wrapper 0.0.1
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.
- data/lib/concurrent.rb +5 -0
- data/lib/concurrent/client.rb +57 -0
- data/lib/concurrent/redis_key.rb +13 -0
- data/lib/concurrent/ticket.rb +51 -0
- metadata +50 -0
data/lib/concurrent.rb
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'redis'
|
2
|
+
require File.join(ROOT, 'concurrent', 'ticket')
|
3
|
+
|
4
|
+
class Concurrent
|
5
|
+
class << self
|
6
|
+
attr_accessor :redis_path, :redis_port
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.config
|
10
|
+
yield self
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.sync(uniq_tag)
|
14
|
+
ticket = Ticket.new(uniq_tag)
|
15
|
+
|
16
|
+
ticket.dispatch
|
17
|
+
|
18
|
+
pull_ticket(uniq_tag)
|
19
|
+
|
20
|
+
yield
|
21
|
+
|
22
|
+
ticket.notify
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.pull_ticket(uniq_tag)
|
26
|
+
redis.brpop "client:#{uniq_tag}:list", 0
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.redis(redis_host = '127.0.0.1', redis_port = 6379)
|
30
|
+
@@redis ||= Redis.new :host => redis_host, :port => redis_port
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
|
35
|
+
#require 'active_record'
|
36
|
+
#require 'mysql2'
|
37
|
+
|
38
|
+
#ActiveRecord::Base.establish_connection(
|
39
|
+
#:adapter => 'mysql2',
|
40
|
+
#:host => 'localhost',
|
41
|
+
#:suername => 'root',
|
42
|
+
#:password => '',
|
43
|
+
#:database => 'flames_develop',
|
44
|
+
#:pool => 150
|
45
|
+
#)
|
46
|
+
|
47
|
+
#class Profile < ActiveRecord::Base
|
48
|
+
#end
|
49
|
+
|
50
|
+
#uniq_tag = 'user:1'
|
51
|
+
#1000.times do |i|
|
52
|
+
#Concurrent.sync(uniq_tag) do
|
53
|
+
#puts "sync: #{i + 1}"
|
54
|
+
#Profile.first.increment! :gems, 1
|
55
|
+
#puts '>>>>>executing....'
|
56
|
+
#end
|
57
|
+
#end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
#require File.expand_path './redis_key'
|
2
|
+
require File.join(ROOT, 'concurrent', 'redis_key')
|
3
|
+
|
4
|
+
class Ticket
|
5
|
+
include RedisKey
|
6
|
+
|
7
|
+
#uniq_tag desc:
|
8
|
+
# The concurrent objects who point to same reference,
|
9
|
+
# or represent same row in database must use same uniq_tag.
|
10
|
+
#
|
11
|
+
# NOTICE:
|
12
|
+
# We have to thing the different databases use the same table name and have the same row id,
|
13
|
+
# so if we use the in multi database for control concurrence we have to specify database's uniq tag.
|
14
|
+
#
|
15
|
+
|
16
|
+
def initialize(uniq_tag)
|
17
|
+
@uniq_tag = uniq_tag
|
18
|
+
end
|
19
|
+
|
20
|
+
def dispatch
|
21
|
+
executing ? push_to_client : blocking
|
22
|
+
end
|
23
|
+
|
24
|
+
def blocking
|
25
|
+
redis.lpush blocking_key, @uniq_tag
|
26
|
+
end
|
27
|
+
|
28
|
+
def pop_blocking
|
29
|
+
redis.lpop blocking_key
|
30
|
+
end
|
31
|
+
|
32
|
+
def executing
|
33
|
+
redis.sadd executing_key, @uniq_tag
|
34
|
+
end
|
35
|
+
|
36
|
+
def rem_executing
|
37
|
+
redis.srem executing_key, @uniq_tag
|
38
|
+
end
|
39
|
+
|
40
|
+
def push_to_client
|
41
|
+
redis.lpush client_key, @uniq_tag
|
42
|
+
end
|
43
|
+
|
44
|
+
def notify
|
45
|
+
pop_blocking ? push_to_client : rem_executing
|
46
|
+
end
|
47
|
+
|
48
|
+
def redis
|
49
|
+
Concurrent.redis
|
50
|
+
end
|
51
|
+
end
|
metadata
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: concurrent-wrapper
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Savin Max
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-05-21 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description: concurrent-wrapper make concurrence oriented programming easy. With the
|
15
|
+
wrapper you even don't need to think about concurrence, just live the code in the
|
16
|
+
wraper
|
17
|
+
email: mafei.198@gmail.com
|
18
|
+
executables: []
|
19
|
+
extensions: []
|
20
|
+
extra_rdoc_files: []
|
21
|
+
files:
|
22
|
+
- lib/concurrent.rb
|
23
|
+
- lib/concurrent/client.rb
|
24
|
+
- lib/concurrent/ticket.rb
|
25
|
+
- lib/concurrent/redis_key.rb
|
26
|
+
homepage: http://rubygems.org/gems/concurrent-wrapper
|
27
|
+
licenses: []
|
28
|
+
post_install_message:
|
29
|
+
rdoc_options: []
|
30
|
+
require_paths:
|
31
|
+
- lib
|
32
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
requirements: []
|
45
|
+
rubyforge_project:
|
46
|
+
rubygems_version: 1.8.24
|
47
|
+
signing_key:
|
48
|
+
specification_version: 3
|
49
|
+
summary: concurrence oriented programming wrapper
|
50
|
+
test_files: []
|