noda 0.0.10 → 0.0.11
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +1 -0
- data/VERSION +1 -1
- data/lib/noda.rb +0 -0
- data/lib/noda/job_monitor.rb +3 -0
- data/lib/noda/job_worker.rb +37 -2
- data/lib/noda/rqueue.rb +4 -0
- data/noda.gemspec +1 -1
- metadata +3 -3
data/Rakefile
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.11
|
data/lib/noda.rb
CHANGED
File without changes
|
data/lib/noda/job_monitor.rb
CHANGED
data/lib/noda/job_worker.rb
CHANGED
@@ -1,11 +1,23 @@
|
|
1
1
|
module Noda
|
2
2
|
|
3
|
+
# ジョブワーカー
|
4
|
+
#
|
5
|
+
# ジョブを待ち受けるスレッドです。
|
6
|
+
# Taskを取りだして実行します.
|
7
|
+
# ip=127.0.0.1
|
8
|
+
# w=Noda::JobWorker.new("#{ip}", "10001")
|
9
|
+
# t = DRb.start_service("druby://#{ip}:10101",w)
|
10
|
+
# w.start
|
11
|
+
#
|
12
|
+
#
|
3
13
|
|
4
14
|
class JobWorker
|
5
15
|
attr_reader :thread
|
6
16
|
attr_accessor :max_retry_connect , :wait_time_to_retry
|
7
|
-
|
8
|
-
|
17
|
+
# * server_addr ジョブサーバーアドレス、またはホスト名
|
18
|
+
# * server_port ジョブサーバーポート
|
19
|
+
def initialize( server_addr="localhost",server_port="10001",q="" )
|
20
|
+
@server_uri = "druby://#{server_addr}:#{server_port}/?#{q}"
|
9
21
|
@max_retry_connect = 30
|
10
22
|
@wait_time_to_retry = 2
|
11
23
|
require "socket"
|
@@ -13,6 +25,7 @@ class JobWorker
|
|
13
25
|
self.connect
|
14
26
|
self
|
15
27
|
end
|
28
|
+
# 内部的に使います。ジョブサーバーへ接続
|
16
29
|
def connect_job_server
|
17
30
|
error_conter = 0
|
18
31
|
begin
|
@@ -26,6 +39,11 @@ class JobWorker
|
|
26
39
|
retry
|
27
40
|
end
|
28
41
|
end
|
42
|
+
# 担当ジョブからタスクを実行します.
|
43
|
+
#
|
44
|
+
# タスクは do_task(hash)実装が必須
|
45
|
+
# タスクのクラス定義はrequire必須.(start前にrequire)
|
46
|
+
# タスクのクラス定義はサーバー側から自動ロード(eval)します.
|
29
47
|
def handle_task()
|
30
48
|
# @logger.info("self.class@#{@local_addr}#{self.object_id}"){"i try to pop a task."}
|
31
49
|
task = @job.input.pop
|
@@ -36,10 +54,14 @@ class JobWorker
|
|
36
54
|
result = task.do_task(@job.hash_table)
|
37
55
|
@job.output.push result
|
38
56
|
end
|
57
|
+
# クラス定義をEvalする。クラス定義はサーバーから取り出す.
|
58
|
+
# ワーカー側にクラス定義を動的に渡すときに使います.
|
59
|
+
# *name クラス名
|
39
60
|
def load_class(name)
|
40
61
|
s = @job.task_class(name)
|
41
62
|
Noda.module_eval(s)
|
42
63
|
end
|
64
|
+
# ワーカーのメインスレッドを起動します.start で使います.
|
43
65
|
def init_thread
|
44
66
|
@table = @job.hash_table
|
45
67
|
@thread= Thread.new{
|
@@ -49,16 +71,29 @@ class JobWorker
|
|
49
71
|
}
|
50
72
|
}
|
51
73
|
end
|
74
|
+
|
75
|
+
# サーバーに接続します
|
76
|
+
#
|
52
77
|
def connect
|
53
78
|
self.connect_job_server
|
54
79
|
end
|
80
|
+
|
81
|
+
# 処理を開始します.
|
82
|
+
#
|
83
|
+
# threadを返します. worker を起動しっぱなしにするなら thread.joinしてください
|
55
84
|
def start
|
56
85
|
self.init_thread
|
57
86
|
@thread.join
|
58
87
|
end
|
88
|
+
|
89
|
+
# ワーカースレッドの状態を取り出します.
|
90
|
+
#
|
91
|
+
# マルチスレッドでブロックされてるとsleep になります
|
59
92
|
def status
|
60
93
|
@thread.status if @thread
|
61
94
|
end
|
95
|
+
|
96
|
+
# スレッド停止します.このインスタンスは死にません.start で再起動します.
|
62
97
|
def stop
|
63
98
|
@thread.kill
|
64
99
|
end
|
data/lib/noda/rqueue.rb
CHANGED
data/noda.gemspec
CHANGED
metadata
CHANGED