noda 0.0.10 → 0.0.11
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/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