resque-pool-dynamic 0.1.0
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/.gitignore +6 -0
- data/Gemfile +4 -0
- data/README.md +242 -0
- data/Rakefile +42 -0
- data/doc/Resque/Pool/Dynamic/Logfile.html +722 -0
- data/doc/Resque/Pool/Dynamic/Shell.html +636 -0
- data/doc/Resque/Pool/Dynamic.html +2187 -0
- data/doc/Resque/Pool.html +125 -0
- data/doc/Resque.html +110 -0
- data/doc/_index.html +166 -0
- data/doc/class_list.html +47 -0
- data/doc/css/common.css +1 -0
- data/doc/css/full_list.css +55 -0
- data/doc/css/style.css +322 -0
- data/doc/file.README.html +316 -0
- data/doc/file_list.html +49 -0
- data/doc/frames.html +13 -0
- data/doc/index.html +316 -0
- data/doc/js/app.js +205 -0
- data/doc/js/full_list.js +173 -0
- data/doc/js/jquery.js +16 -0
- data/doc/method_list.html +318 -0
- data/doc/top-level-namespace.html +105 -0
- data/help.yml +140 -0
- data/lib/resque/pool/dynamic/logfile.rb +97 -0
- data/lib/resque/pool/dynamic/shell.rb +106 -0
- data/lib/resque/pool/dynamic/tasks.rb +29 -0
- data/lib/resque/pool/dynamic/version.rb +7 -0
- data/lib/resque/pool/dynamic.rb +217 -0
- data/lib/resque/pool/help.json +1 -0
- data/resque-pool-dynamic.gemspec +29 -0
- metadata +127 -0
data/doc/css/style.css
ADDED
@@ -0,0 +1,322 @@
|
|
1
|
+
body {
|
2
|
+
padding: 0 20px;
|
3
|
+
font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif;
|
4
|
+
font-size: 13px;
|
5
|
+
}
|
6
|
+
body.frames { padding: 0 5px; }
|
7
|
+
h1 { font-size: 25px; margin: 1em 0 0.5em; padding-top: 4px; border-top: 1px dotted #d5d5d5; }
|
8
|
+
h1.noborder { border-top: 0px; margin-top: 0; padding-top: 4px; }
|
9
|
+
h1.title { margin-bottom: 10px; }
|
10
|
+
h1.alphaindex { margin-top: 0; font-size: 22px; }
|
11
|
+
h2 {
|
12
|
+
padding: 0;
|
13
|
+
padding-bottom: 3px;
|
14
|
+
border-bottom: 1px #aaa solid;
|
15
|
+
font-size: 1.4em;
|
16
|
+
margin: 1.8em 0 0.5em;
|
17
|
+
}
|
18
|
+
h2 small { font-weight: normal; font-size: 0.7em; display: block; float: right; }
|
19
|
+
.clear { clear: both; }
|
20
|
+
.inline { display: inline; }
|
21
|
+
.inline p:first-child { display: inline; }
|
22
|
+
.docstring h1, .docstring h2, .docstring h3, .docstring h4 { padding: 0; border: 0; border-bottom: 1px dotted #bbb; }
|
23
|
+
.docstring h1 { font-size: 1.2em; }
|
24
|
+
.docstring h2 { font-size: 1.1em; }
|
25
|
+
.docstring h3, .docstring h4 { font-size: 1em; border-bottom: 0; padding-top: 10px; }
|
26
|
+
.summary_desc .object_link, .docstring .object_link { font-family: monospace; }
|
27
|
+
.rdoc-term { padding-right: 25px; font-weight: bold; }
|
28
|
+
.rdoc-list p { margin: 0; padding: 0; margin-bottom: 4px; }
|
29
|
+
|
30
|
+
/* style for <ul> */
|
31
|
+
#filecontents li > p, .docstring li > p { margin: 0px; }
|
32
|
+
#filecontents ul, .docstring ul { padding-left: 20px; }
|
33
|
+
/* style for <dl> */
|
34
|
+
#filecontents dl, .docstring dl { border: 1px solid #ccc; }
|
35
|
+
#filecontents dt, .docstring dt { background: #ddd; font-weight: bold; padding: 3px 5px; }
|
36
|
+
#filecontents dd, .docstring dd { padding: 5px 0px; margin-left: 18px; }
|
37
|
+
#filecontents dd > p, .docstring dd > p { margin: 0px; }
|
38
|
+
|
39
|
+
.note {
|
40
|
+
color: #222;
|
41
|
+
-moz-border-radius: 3px; -webkit-border-radius: 3px;
|
42
|
+
background: #e3e4e3; border: 1px solid #d5d5d5; padding: 7px 10px;
|
43
|
+
display: block;
|
44
|
+
}
|
45
|
+
.note.todo { background: #ffffc5; border-color: #ececaa; }
|
46
|
+
.note.returns_void { background: #efefef; }
|
47
|
+
.note.deprecated { background: #ffe5e5; border-color: #e9dada; }
|
48
|
+
.note.private { background: #ffffc5; border-color: #ececaa; }
|
49
|
+
.note.title { text-transform: lowercase; padding: 1px 5px; font-size: 0.9em; font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif; display: inline; }
|
50
|
+
.summary_signature + .note.title { margin-left: 7px; }
|
51
|
+
h1 .note.title { font-size: 0.5em; font-weight: normal; padding: 3px 5px; position: relative; top: -3px; text-transform: capitalize; }
|
52
|
+
.note.title.constructor { color: #fff; background: #6a98d6; border-color: #6689d6; }
|
53
|
+
.note.title.writeonly { color: #fff; background: #45a638; border-color: #2da31d; }
|
54
|
+
.note.title.readonly { color: #fff; background: #6a98d6; border-color: #6689d6; }
|
55
|
+
.note.title.private { background: #d5d5d5; border-color: #c5c5c5; }
|
56
|
+
.discussion .note { margin-top: 6px; }
|
57
|
+
.discussion .note:first-child { margin-top: 0; }
|
58
|
+
|
59
|
+
h3.inherited {
|
60
|
+
font-style: italic;
|
61
|
+
font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif;
|
62
|
+
font-weight: normal;
|
63
|
+
padding: 0;
|
64
|
+
margin: 0;
|
65
|
+
margin-top: 12px;
|
66
|
+
margin-bottom: 3px;
|
67
|
+
font-size: 13px;
|
68
|
+
}
|
69
|
+
p.inherited {
|
70
|
+
padding: 0;
|
71
|
+
margin: 0;
|
72
|
+
margin-left: 25px;
|
73
|
+
}
|
74
|
+
|
75
|
+
#filecontents dl.box, dl.box {
|
76
|
+
border: 0;
|
77
|
+
width: 520px;
|
78
|
+
font-size: 1em;
|
79
|
+
}
|
80
|
+
#filecontents dl.box dt, dl.box dt {
|
81
|
+
float: left;
|
82
|
+
display: block;
|
83
|
+
width: 100px;
|
84
|
+
margin: 0;
|
85
|
+
text-align: right;
|
86
|
+
font-weight: bold;
|
87
|
+
background: transparent;
|
88
|
+
border: 1px solid #aaa;
|
89
|
+
border-width: 1px 0px 0px 1px;
|
90
|
+
padding: 6px 0;
|
91
|
+
padding-right: 10px;
|
92
|
+
}
|
93
|
+
#filecontents dl.box dd, dl.box dd {
|
94
|
+
float: left;
|
95
|
+
display: block;
|
96
|
+
width: 380px;
|
97
|
+
margin: 0;
|
98
|
+
padding: 6px 0;
|
99
|
+
padding-right: 20px;
|
100
|
+
border: 1px solid #aaa;
|
101
|
+
border-width: 1px 1px 0 0;
|
102
|
+
}
|
103
|
+
#filecontents dl.box .last, dl.box .last {
|
104
|
+
border-bottom: 1px solid #aaa;
|
105
|
+
}
|
106
|
+
#filecontents dl.box .r1, dl.box .r1 { background: #eee; }
|
107
|
+
|
108
|
+
ul.toplevel { list-style: none; padding-left: 0; font-size: 1.1em; }
|
109
|
+
#files { padding-left: 15px; font-size: 1.1em; }
|
110
|
+
|
111
|
+
#files { padding: 0; }
|
112
|
+
#files li { list-style: none; display: inline; padding: 7px 12px; line-height: 35px; }
|
113
|
+
|
114
|
+
dl.constants { margin-left: 40px; }
|
115
|
+
dl.constants dt { font-weight: bold; font-size: 1.1em; margin-bottom: 5px; }
|
116
|
+
dl.constants dd { width: 75%; white-space: pre; font-family: monospace; margin-bottom: 18px; }
|
117
|
+
|
118
|
+
.summary_desc { margin-left: 32px; display: block; font-family: sans-serif; }
|
119
|
+
.summary_desc tt { font-size: 0.9em; }
|
120
|
+
dl.constants .note { padding: 2px 6px; padding-right: 12px; margin-top: 6px; }
|
121
|
+
dl.constants .docstring { margin-left: 32px; font-size: 0.9em; font-weight: normal; }
|
122
|
+
dl.constants .tags { padding-left: 32px; font-size: 0.9em; line-height: 0.8em; }
|
123
|
+
dl.constants .discussion *:first-child { margin-top: 0; }
|
124
|
+
dl.constants .discussion *:last-child { margin-bottom: 0; }
|
125
|
+
|
126
|
+
.method_details { border-top: 1px dotted #aaa; margin-top: 15px; padding-top: 0; }
|
127
|
+
.method_details.first { border: 0; }
|
128
|
+
p.signature {
|
129
|
+
font-size: 1.1em; font-weight: normal; font-family: Monaco, Consolas, Courier, monospace;
|
130
|
+
padding: 6px 10px; margin-top: 18px;
|
131
|
+
background: #e5e8ff; border: 1px solid #d8d8e5; -moz-border-radius: 3px; -webkit-border-radius: 3px;
|
132
|
+
}
|
133
|
+
p.signature tt { font-family: Monaco, Consolas, Courier, monospace; }
|
134
|
+
p.signature .overload { display: block; }
|
135
|
+
p.signature .extras { font-weight: normal; font-family: sans-serif; color: #444; font-size: 1em; }
|
136
|
+
p.signature .aliases { display: block; font-weight: normal; font-size: 0.9em; font-family: sans-serif; margin-top: 0px; color: #555; }
|
137
|
+
p.signature .aliases .names { font-family: Monaco, Consolas, Courier, monospace; font-weight: bold; color: #000; font-size: 1.2em; }
|
138
|
+
|
139
|
+
.tags h3 { font-size: 1em; margin-bottom: 0; }
|
140
|
+
.tags ul { margin-top: 5px; padding-left: 30px; list-style: square; }
|
141
|
+
.tags ul li { margin-bottom: 3px; }
|
142
|
+
.tags ul .name { font-family: monospace; font-weight: bold; }
|
143
|
+
.tags ul .note { padding: 3px 6px; }
|
144
|
+
.tags { margin-bottom: 12px; }
|
145
|
+
|
146
|
+
.tags .examples h3 { margin-bottom: 10px; }
|
147
|
+
.tags .examples h4 { padding: 0; margin: 0; margin-left: 15px; font-weight: bold; font-size: 0.9em; }
|
148
|
+
|
149
|
+
.tags .overload .overload_item { list-style: none; margin-bottom: 25px; }
|
150
|
+
.tags .overload .overload_item .signature {
|
151
|
+
padding: 2px 8px;
|
152
|
+
background: #e5e8ff; border: 1px solid #d8d8e5; -moz-border-radius: 3px; -webkit-border-radius: 3px;
|
153
|
+
}
|
154
|
+
.tags .overload .signature { margin-left: -15px; font-family: monospace; display: block; font-size: 1.1em; }
|
155
|
+
.tags .overload .docstring { margin-top: 15px; }
|
156
|
+
|
157
|
+
.defines { display: none; }
|
158
|
+
|
159
|
+
#method_missing_details .notice.this { position: relative; top: -8px; color: #888; padding: 0; margin: 0; }
|
160
|
+
|
161
|
+
.showSource { font-size: 0.9em; }
|
162
|
+
.showSource a:link, .showSource a:visited { text-decoration: none; color: #666; }
|
163
|
+
|
164
|
+
#content a:link, #content a:visited { text-decoration: none; color: #05a; }
|
165
|
+
#content a:hover { background: #ffffa5; }
|
166
|
+
div.docstring, p.docstring { margin-right: 6em; }
|
167
|
+
|
168
|
+
ul.summary {
|
169
|
+
list-style: none;
|
170
|
+
font-family: monospace;
|
171
|
+
font-size: 1em;
|
172
|
+
line-height: 1.5em;
|
173
|
+
}
|
174
|
+
ul.summary a:link, ul.summary a:visited {
|
175
|
+
text-decoration: none; font-size: 1.1em;
|
176
|
+
}
|
177
|
+
ul.summary li { margin-bottom: 5px; }
|
178
|
+
.summary .summary_signature {
|
179
|
+
padding: 1px 10px;
|
180
|
+
background: #eaeaff; border: 1px solid #dfdfe5;
|
181
|
+
-moz-border-radius: 3px; -webkit-border-radius: 3px;
|
182
|
+
}
|
183
|
+
.summary_signature:hover { background: #eeeeff; cursor: pointer; }
|
184
|
+
ul.summary.compact li { display: inline-block; margin: 0px 5px 0px 0px; line-height: 2.6em;}
|
185
|
+
ul.summary.compact .summary_signature { padding: 5px 7px; padding-right: 4px; }
|
186
|
+
#content .summary_signature:hover a:link,
|
187
|
+
#content .summary_signature:hover a:visited {
|
188
|
+
background: transparent;
|
189
|
+
color: #48f;
|
190
|
+
}
|
191
|
+
|
192
|
+
p.inherited a { font-family: monospace; font-size: 0.9em; }
|
193
|
+
p.inherited { word-spacing: 5px; font-size: 1.2em; }
|
194
|
+
|
195
|
+
p.children { font-size: 1.2em; }
|
196
|
+
p.children a { font-size: 0.9em; }
|
197
|
+
p.children strong { font-size: 0.8em; }
|
198
|
+
p.children strong.modules { padding-left: 5px; }
|
199
|
+
|
200
|
+
ul.fullTree { display: none; padding-left: 0; list-style: none; margin-left: 0; margin-bottom: 10px; }
|
201
|
+
ul.fullTree ul { margin-left: 0; padding-left: 0; list-style: none; }
|
202
|
+
ul.fullTree li { text-align: center; padding-top: 18px; padding-bottom: 12px; background: url(data:image/gif;base64,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) no-repeat top center; }
|
203
|
+
ul.fullTree li:first-child { padding-top: 0; background: transparent; }
|
204
|
+
ul.fullTree li:last-child { padding-bottom: 0; }
|
205
|
+
.showAll ul.fullTree { display: block; }
|
206
|
+
.showAll .inheritName { display: none; }
|
207
|
+
|
208
|
+
#search { position: absolute; right: 14px; top: 0px; }
|
209
|
+
#search a:link, #search a:visited {
|
210
|
+
display: block; float: left; margin-right: 4px;
|
211
|
+
padding: 8px 10px; text-decoration: none; color: #05a;
|
212
|
+
border: 1px solid #d8d8e5;
|
213
|
+
-moz-border-radius-bottomleft: 3px; -moz-border-radius-bottomright: 3px;
|
214
|
+
-webkit-border-bottom-left-radius: 3px; -webkit-border-bottom-right-radius: 3px;
|
215
|
+
background: #eaf0ff;
|
216
|
+
-webkit-box-shadow: -1px 1px 3px #ddd;
|
217
|
+
}
|
218
|
+
#search a:hover { background: #f5faff; color: #06b; }
|
219
|
+
#search a.active {
|
220
|
+
background: #568; padding-bottom: 20px; color: #fff; border: 1px solid #457;
|
221
|
+
-moz-border-radius-topleft: 5px; -moz-border-radius-topright: 5px;
|
222
|
+
-webkit-border-top-left-radius: 5px; -webkit-border-top-right-radius: 5px;
|
223
|
+
}
|
224
|
+
#search a.inactive { color: #999; }
|
225
|
+
.frames #search { display: none; }
|
226
|
+
.inheritanceTree, .toggleDefines { float: right; }
|
227
|
+
|
228
|
+
#menu { font-size: 1.3em; color: #bbb; top: -5px; position: relative; }
|
229
|
+
#menu .title, #menu a { font-size: 0.7em; }
|
230
|
+
#menu .title a { font-size: 1em; }
|
231
|
+
#menu .title { color: #555; }
|
232
|
+
#menu a:link, #menu a:visited { color: #333; text-decoration: none; border-bottom: 1px dotted #bbd; }
|
233
|
+
#menu a:hover { color: #05a; }
|
234
|
+
#menu .noframes { display: none; }
|
235
|
+
.frames #menu .noframes { display: inline; float: right; }
|
236
|
+
|
237
|
+
#footer { margin-top: 15px; border-top: 1px solid #ccc; text-align: center; padding: 7px 0; color: #999; }
|
238
|
+
#footer a:link, #footer a:visited { color: #444; text-decoration: none; border-bottom: 1px dotted #bbd; }
|
239
|
+
#footer a:hover { color: #05a; }
|
240
|
+
|
241
|
+
#listing ul.alpha { font-size: 1.1em; }
|
242
|
+
#listing ul.alpha { margin: 0; padding: 0; padding-bottom: 10px; list-style: none; }
|
243
|
+
#listing ul.alpha li.letter { font-size: 1.4em; padding-bottom: 10px; }
|
244
|
+
#listing ul.alpha ul { margin: 0; padding-left: 15px; }
|
245
|
+
#listing ul small { color: #666; font-size: 0.7em; }
|
246
|
+
|
247
|
+
li.r1 { background: #f0f0f0; }
|
248
|
+
li.r2 { background: #fafafa; }
|
249
|
+
|
250
|
+
#search_frame {
|
251
|
+
z-index: 9999;
|
252
|
+
background: #fff;
|
253
|
+
display: none;
|
254
|
+
position: absolute;
|
255
|
+
top: 36px;
|
256
|
+
right: 18px;
|
257
|
+
width: 500px;
|
258
|
+
height: 80%;
|
259
|
+
overflow-y: scroll;
|
260
|
+
border: 1px solid #999;
|
261
|
+
border-collapse: collapse;
|
262
|
+
-webkit-box-shadow: -7px 5px 25px #aaa;
|
263
|
+
-moz-box-shadow: -7px 5px 25px #aaa;
|
264
|
+
-moz-border-radius: 2px;
|
265
|
+
-webkit-border-radius: 2px;
|
266
|
+
}
|
267
|
+
|
268
|
+
#content ul.summary li.deprecated .summary_signature a:link,
|
269
|
+
#content ul.summary li.deprecated .summary_signature a:visited { text-decoration: line-through; font-style: italic; }
|
270
|
+
|
271
|
+
#toc {
|
272
|
+
padding: 20px; padding-right: 30px; border: 1px solid #ddd; float: right; background: #fff; margin-left: 20px; margin-bottom: 20px;
|
273
|
+
max-width: 300px;
|
274
|
+
-webkit-box-shadow: -2px 2px 6px #bbb;
|
275
|
+
-moz-box-shadow: -2px 2px 6px #bbb;
|
276
|
+
z-index: 5000;
|
277
|
+
position: relative;
|
278
|
+
}
|
279
|
+
#toc.nofloat { float: none; max-width: none; border: none; padding: 0; margin: 20px 0; -webkit-box-shadow: none; -moz-box-shadow: none; }
|
280
|
+
#toc.nofloat.hidden { padding: 0; background: 0; margin-bottom: 5px; }
|
281
|
+
#toc .title { margin: 0; }
|
282
|
+
#toc ol { padding-left: 1.8em; }
|
283
|
+
#toc li { font-size: 1.1em; line-height: 1.7em; }
|
284
|
+
#toc > ol > li { font-size: 1.1em; font-weight: bold; }
|
285
|
+
#toc ol > ol { font-size: 0.9em; }
|
286
|
+
#toc ol ol > ol { padding-left: 2.3em; }
|
287
|
+
#toc ol + li { margin-top: 0.3em; }
|
288
|
+
#toc.hidden { padding: 10px; background: #f6f6f6; -webkit-box-shadow: none; -moz-box-shadow: none; }
|
289
|
+
#filecontents h1 + #toc.nofloat { margin-top: 0; }
|
290
|
+
|
291
|
+
/* syntax highlighting */
|
292
|
+
.source_code { display: none; padding: 3px 8px; border-left: 8px solid #ddd; margin-top: 5px; }
|
293
|
+
#filecontents pre.code, .docstring pre.code, .source_code pre { font-family: monospace; }
|
294
|
+
#filecontents pre.code, .docstring pre.code { display: block; }
|
295
|
+
.source_code .lines { padding-right: 12px; color: #555; text-align: right; }
|
296
|
+
#filecontents pre.code, .docstring pre.code,
|
297
|
+
.tags pre.example { padding: 5px 12px; margin-top: 4px; border: 1px solid #eef; background: #f5f5ff; }
|
298
|
+
pre.code { color: #000; }
|
299
|
+
pre.code .info.file { color: #555; }
|
300
|
+
pre.code .val { color: #036A07; }
|
301
|
+
pre.code .tstring_content,
|
302
|
+
pre.code .heredoc_beg, pre.code .heredoc_end,
|
303
|
+
pre.code .qwords_beg, pre.code .qwords_end,
|
304
|
+
pre.code .tstring, pre.code .dstring { color: #036A07; }
|
305
|
+
pre.code .fid, pre.code .rubyid_new, pre.code .rubyid_to_s,
|
306
|
+
pre.code .rubyid_to_sym, pre.code .rubyid_to_f,
|
307
|
+
pre.code .dot + pre.code .id,
|
308
|
+
pre.code .rubyid_to_i pre.code .rubyid_each { color: #0085FF; }
|
309
|
+
pre.code .comment { color: #0066FF; }
|
310
|
+
pre.code .const, pre.code .constant { color: #585CF6; }
|
311
|
+
pre.code .symbol { color: #C5060B; }
|
312
|
+
pre.code .kw,
|
313
|
+
pre.code .label,
|
314
|
+
pre.code .rubyid_require,
|
315
|
+
pre.code .rubyid_extend,
|
316
|
+
pre.code .rubyid_include { color: #0000FF; }
|
317
|
+
pre.code .ivar { color: #318495; }
|
318
|
+
pre.code .gvar,
|
319
|
+
pre.code .rubyid_backref,
|
320
|
+
pre.code .rubyid_nth_ref { color: #6D79DE; }
|
321
|
+
pre.code .regexp, .dregexp { color: #036A07; }
|
322
|
+
pre.code a { border-bottom: 1px dotted #bbf; }
|
@@ -0,0 +1,316 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
2
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
3
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
4
|
+
<head>
|
5
|
+
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
6
|
+
<title>
|
7
|
+
File: README
|
8
|
+
|
9
|
+
— Documentation by YARD 0.7.5
|
10
|
+
|
11
|
+
</title>
|
12
|
+
|
13
|
+
<link rel="stylesheet" href="css/style.css" type="text/css" media="screen" charset="utf-8" />
|
14
|
+
|
15
|
+
<link rel="stylesheet" href="css/common.css" type="text/css" media="screen" charset="utf-8" />
|
16
|
+
|
17
|
+
<script type="text/javascript" charset="utf-8">
|
18
|
+
relpath = '';
|
19
|
+
if (relpath != '') relpath += '/';
|
20
|
+
</script>
|
21
|
+
|
22
|
+
<script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
|
23
|
+
|
24
|
+
<script type="text/javascript" charset="utf-8" src="js/app.js"></script>
|
25
|
+
|
26
|
+
|
27
|
+
</head>
|
28
|
+
<body>
|
29
|
+
<script type="text/javascript" charset="utf-8">
|
30
|
+
if (window.top.frames.main) document.body.className = 'frames';
|
31
|
+
</script>
|
32
|
+
|
33
|
+
<div id="header">
|
34
|
+
<div id="menu">
|
35
|
+
|
36
|
+
<a href="_index.html" title="Index">Index</a> »
|
37
|
+
<span class="title">File: README</span>
|
38
|
+
|
39
|
+
|
40
|
+
<div class="noframes"><span class="title">(</span><a href="." target="_top">no frames</a><span class="title">)</span></div>
|
41
|
+
</div>
|
42
|
+
|
43
|
+
<div id="search">
|
44
|
+
|
45
|
+
<a id="class_list_link" href="#">Class List</a>
|
46
|
+
|
47
|
+
<a id="method_list_link" href="#">Method List</a>
|
48
|
+
|
49
|
+
<a id="file_list_link" href="#">File List</a>
|
50
|
+
|
51
|
+
</div>
|
52
|
+
<div class="clear"></div>
|
53
|
+
</div>
|
54
|
+
|
55
|
+
<iframe id="search_frame"></iframe>
|
56
|
+
|
57
|
+
<div id="content"><div id='filecontents'><h1 id="dynamic-resque-pool">Dynamic Resque Pool</h1>
|
58
|
+
|
59
|
+
<p><a href="https://github.com/nevans/resque-pool">Resque pool</a> by Nicholas Evans
|
60
|
+
is a library for managing a pool of
|
61
|
+
<a href="http://github.com/defunkt/resque">resque</a> workers. Given a a config
|
62
|
+
file, it manages your workers for you, starting up the appropriate
|
63
|
+
number of workers for each worker type.</p>
|
64
|
+
|
65
|
+
<p>While the resque pool is convenient for a permanent process
|
66
|
+
overlooking a fairly constant set of workers, it is less than
|
67
|
+
convenient to use for more dynamic tasks - one-time long running batch
|
68
|
+
processing worker families that need to be started and supervised
|
69
|
+
manually, and often require adjusting number of worker processes for
|
70
|
+
maximum performance.</p>
|
71
|
+
|
72
|
+
<p>Workflow for this kind of task would be:</p>
|
73
|
+
|
74
|
+
<ul>
|
75
|
+
<li>prepare a yaml file with number of workers</li>
|
76
|
+
<li>start resque-pool</li>
|
77
|
+
<li><code>tail -f</code> the log file on the other console</li>
|
78
|
+
<li>look into <code>pstree</code> (or <code>ps faxuw</code> on Linux)</li>
|
79
|
+
<li>babysit the process, check the system load whether number of workers
|
80
|
+
needs to be adjusted</li>
|
81
|
+
<li>edit the yaml file</li>
|
82
|
+
<li><code>kill -HUP</code> the resque pool master (hope you remembered the PID from
|
83
|
+
pstree!)</li>
|
84
|
+
<li>rinse, repeat</li>
|
85
|
+
</ul>
|
86
|
+
|
87
|
+
<p>Or you can add <code>gem "resque-pool-dynamic"</code> to your Gemfile, <code>require
|
88
|
+
'resque/pool/dynamic/tasks'</code> to your Rakefile, and start an
|
89
|
+
interactive CLI interface that controls the resque-pool-master.</p>
|
90
|
+
|
91
|
+
<h2 id="example-resque-pool-manager-session">Example resque-pool-manager session</h2>
|
92
|
+
|
93
|
+
<pre class="code ruby"><code>$ bundle exec rake resque:pool:dynamic WORKERS=foo=2:bar=2:\*=1
|
94
|
+
resque-pool-manager[21134]: started manager
|
95
|
+
|
96
|
+
Status: running, pid: 21134
|
97
|
+
Configuration:
|
98
|
+
bar: 2
|
99
|
+
"*": 1
|
100
|
+
foo: 2
|
101
|
+
Process tree:
|
102
|
+
-+= 21134 japhy resque-pool-master: managing [21136, 21135, 21137, 21138, 21141]
|
103
|
+
|--- 21135 japhy resque-1.20.0: Waiting for bar
|
104
|
+
|--- 21136 japhy resque-1.20.0: Waiting for bar
|
105
|
+
|--- 21137 japhy resque-1.20.0: Waiting for *
|
106
|
+
|--- 21138 japhy resque-1.20.0: Waiting for foo
|
107
|
+
\--- 21141 japhy resque-1.20.0: Waiting for foo
|
108
|
+
|
109
|
+
>> log.tail
|
110
|
+
resque-pool-manager[21134]: Pool contains worker PIDs: [21136, 21135, 21137, 21138, 21141]
|
111
|
+
resque-pool-worker[21135]: Starting worker portinari.local:21135:bar
|
112
|
+
resque-pool-worker[21137]: Starting worker portinari.local:21137:*
|
113
|
+
|
114
|
+
resque-pool-worker[21136]: Starting worker portinari.local:21136:bar
|
115
|
+
resque-pool-worker[21141]: Starting worker portinari.local:21141:foo
|
116
|
+
resque-pool-worker[21138]: Starting worker portinari.local:21138:foo
|
117
|
+
</code></pre>
|
118
|
+
|
119
|
+
<p>(log.tail is following the logfile like <code>tail -f</code> until you break with ^C)</p>
|
120
|
+
|
121
|
+
<pre class="code ruby"><code>^C>> config :foo => 1, :bar => 4
|
122
|
+
Reloading resque-pool-master 21134 configuration
|
123
|
+
=> {"bar"=>4, "*"=>1, "foo"=>1}
|
124
|
+
>> status
|
125
|
+
|
126
|
+
Status: running, pid: 21134
|
127
|
+
Configuration:
|
128
|
+
bar: 4
|
129
|
+
"*": 1
|
130
|
+
foo: 1
|
131
|
+
Process tree:
|
132
|
+
-+= 21134 japhy resque-pool-master: managing [21176, 21178, 21162, 21163, 21180, 21181]
|
133
|
+
|--- 21162 japhy resque-1.20.0: Waiting for bar
|
134
|
+
|--- 21163 japhy resque-1.20.0: Waiting for bar
|
135
|
+
|--- 21176 japhy resque-1.20.0: Waiting for bar
|
136
|
+
|--- 21178 japhy resque-1.20.0: Waiting for bar
|
137
|
+
|--- 21180 japhy resque-1.20.0: Waiting for *
|
138
|
+
\--- 21181 japhy resque-1.20.0: Waiting for foo
|
139
|
+
|
140
|
+
>> log.tail
|
141
|
+
resque-pool-manager[21134]: HUP: reload config file and reload logfiles
|
142
|
+
resque-pool-manager[21134]: Flushing logs
|
143
|
+
resque-pool-manager[21134]: HUP: gracefully shutdown old children (which have old logfiles open)
|
144
|
+
resque-pool-manager[21134]: HUP: new children will inherit new logfiles
|
145
|
+
resque-pool-worker[21163]: Starting worker portinari.local:21163:bar
|
146
|
+
resque-pool-worker[21162]: Starting worker portinari.local:21162:bar
|
147
|
+
resque-pool-manager[21134]: Reaped resque worker[21136] (status: 0) queues: bar
|
148
|
+
resque-pool-manager[21134]: Reaped resque worker[21135] (status: 0) queues: bar
|
149
|
+
resque-pool-worker[21176]: Starting worker portinari.local:21176:bar
|
150
|
+
resque-pool-worker[21178]: Starting worker portinari.local:21178:bar
|
151
|
+
resque-pool-manager[21134]: Reaped resque worker[21141] (status: 0) queues: foo
|
152
|
+
resque-pool-manager[21134]: Reaped resque worker[21138] (status: 0) queues: foo
|
153
|
+
resque-pool-worker[21180]: Starting worker portinari.local:21180:*
|
154
|
+
resque-pool-worker[21181]: Starting worker portinari.local:21181:foo
|
155
|
+
^C>> exit
|
156
|
+
Bye!
|
157
|
+
Shutting down resque-pool-master 21134
|
158
|
+
resque-pool-manager[21134]: INT: immediate shutdown (graceful worker shutdown)
|
159
|
+
resque-pool-manager[21134]: manager finished
|
160
|
+
$ _
|
161
|
+
</code></pre>
|
162
|
+
|
163
|
+
<h2 id="command-line-interface">Command Line Interface</h2>
|
164
|
+
|
165
|
+
<p>The CLI is a slightly customized Ripl shell (an IRB replacement)
|
166
|
+
started in context of a <code>Resque::Pool::Dynamic</code> instance. You can use
|
167
|
+
all Ruby you want, and call all the methods for controlling the resque
|
168
|
+
pool. A simple built-in help for the custom methods is included:</p>
|
169
|
+
|
170
|
+
<pre class="code ruby"><code>>> help
|
171
|
+
Known commands:
|
172
|
+
config - "WORKERS", as interpreted by the #parse_config_string method.
|
173
|
+
config_path - Path to the temporary config file.
|
174
|
+
exit - Finish work
|
175
|
+
has_log? - True if we have an open log file.
|
176
|
+
kill! - Send signal to a running resque-pool.
|
177
|
+
log - Open log of resque-pool process.
|
178
|
+
log.ff - Fast forward until end of file (see IO::Tail#backward).
|
179
|
+
log.rew - Rewind until beginning of file (see IO::Tail#forward).
|
180
|
+
log.rewind - Rewind until beginning of file (see IO::Tail#forward).
|
181
|
+
log.tail - Show last n lines of the file, or follow the file.
|
182
|
+
log.tail_to_eof - Print contents of the file until current end of file.
|
183
|
+
log.tail_until - Follow the file until a line matches regexp.
|
184
|
+
log_path - Logfile path.
|
185
|
+
pid - PID of the resque-pool process, or nil if it's not running.
|
186
|
+
pstree - Show child process tree by calling `pstree` system command.
|
187
|
+
reload - Reload resque-pool configuration.
|
188
|
+
start - Start resque-pool, showing startup logs.
|
189
|
+
start! - Fork a child process for resque-pool master.
|
190
|
+
status - Show current status.
|
191
|
+
stop - Stop running resque-pool, show shutdown logs.
|
192
|
+
stop! - Stop running resque-pool.
|
193
|
+
write_config - Write temporary configuration file.
|
194
|
+
For details, type: help command
|
195
|
+
>> help config
|
196
|
+
-------------------------------- Method: #config (Resque::Pool::Dynamic)
|
197
|
+
(Defined in: lib/resque/pool/dynamic/process.rb)
|
198
|
+
dynamic.config -> Hash
|
199
|
+
dynamic.config(opts) -> Hash
|
200
|
+
------------------------------------------------------------------------
|
201
|
+
Note: Default configuration is taken from environment variable
|
202
|
+
"WORKERS", as interpreted by the #parse_config_string method.
|
203
|
+
Examples:
|
204
|
+
---------
|
205
|
+
# config
|
206
|
+
#=> {"foo"=>1, "bar"=>2}
|
207
|
+
config :foo => 2, :baz => 7
|
208
|
+
#=> {"foo"=>2, "baz"=>7, "bar"=>2}
|
209
|
+
config :bar => 0
|
210
|
+
#=> {"foo"=>2, "baz"=>7}
|
211
|
+
Overloads:
|
212
|
+
----------
|
213
|
+
------------------------------------------------------------------------
|
214
|
+
dynamic.config -> Hash
|
215
|
+
------------------------------------------------------------------------
|
216
|
+
Show current workers configuration
|
217
|
+
Returns:
|
218
|
+
--------
|
219
|
+
(Hash) -
|
220
|
+
------------------------------------------------------------------------
|
221
|
+
dynamic.config(opts) -> Hash
|
222
|
+
------------------------------------------------------------------------
|
223
|
+
Update workers configuration. If configuration has change and
|
224
|
+
resque-pool is running, it is reloaded.
|
225
|
+
Parameters:
|
226
|
+
-----------
|
227
|
+
(Hash) opts - Dictionary of worker process counts to update
|
228
|
+
(pass 0 or nil as value to delete all workers for a queue from pool)
|
229
|
+
Returns:
|
230
|
+
--------
|
231
|
+
(Hash) - Updated config
|
232
|
+
>> _
|
233
|
+
</code></pre>
|
234
|
+
|
235
|
+
<p>The built-in help is autogenerated from Yard documentation on methods;
|
236
|
+
if you’re curious, look into the Rakefile for details.</p>
|
237
|
+
|
238
|
+
<h2 id="rake-task-documentation">Rake task documentation</h2>
|
239
|
+
|
240
|
+
<pre class="code ruby"><code>$ bundle exec rake -D resque:pool:dynamic
|
241
|
+
rake resque:pool:dynamic
|
242
|
+
Starts a dynamic pool of Resque worker processes.
|
243
|
+
|
244
|
+
Variables:
|
245
|
+
WORKERS=worker spec - specify initial numbers of workers
|
246
|
+
(look below for format description)
|
247
|
+
NO_START=1 - don't start resque-pool master automatically
|
248
|
+
(default is to start)
|
249
|
+
|
250
|
+
Workers spec format:
|
251
|
+
queue_name=process_number[:queue_name=process_number[:...]]
|
252
|
+
|
253
|
+
queue_name can be whatever resque:work will accept as QUEUE=
|
254
|
+
parameter.
|
255
|
+
|
256
|
+
Example:
|
257
|
+
$ rake resque:pool:dynamic WORKERS=foo=1:bar=1:baz,quux,xyzzy=5:*=2
|
258
|
+
will start:
|
259
|
+
- one worker for queue 'foo'
|
260
|
+
- one worker for queue 'bar'
|
261
|
+
- five workers for queues baz,quux,xyzzy
|
262
|
+
- two workers for all queues
|
263
|
+
</code></pre>
|
264
|
+
|
265
|
+
<h2 id="api-and-code-structure">API and code structure</h2>
|
266
|
+
|
267
|
+
<p>The Rake task, defined in <code>resque/pool/dynamic/tasks.rb</code>, is a
|
268
|
+
one-liner calling out to <code>Resque::Pool::Dynamic.shell</code>, which starts
|
269
|
+
the command line interface.</p>
|
270
|
+
|
271
|
+
<p>The CLI itself, defined in <code>resque/pool/dynamic/shell.rb</code>, is a thin
|
272
|
+
layer (8 lines of code + Ripl UI tweaks) over an instance of the
|
273
|
+
<code>Resque::Pool::Dynamic</code> class.</p>
|
274
|
+
|
275
|
+
<p>The workhorse <code>Resque::Pool::Dynamic</code> class is defined in
|
276
|
+
<code>resque/pool/dynamic.rb</code>. It can be easily instantiated in the code
|
277
|
+
independent from the CLI; the CLI commands are just instance methods
|
278
|
+
you can call then.</p>
|
279
|
+
|
280
|
+
<h3 id="ideas">Ideas</h3>
|
281
|
+
|
282
|
+
<p>Besides interactive, supervised work, <code>Resque::Pool::Dynamic</code> can be
|
283
|
+
used separately from the UI for dynamic, reactive management of
|
284
|
+
workers, implementing some kind of autoscaling and load distribution
|
285
|
+
logic.</p>
|
286
|
+
|
287
|
+
<p>It can be used during load tests to automatically optimize best number
|
288
|
+
of workers for maximum processing speed, while keeping load average
|
289
|
+
and memory or CPU usage goals.</p>
|
290
|
+
|
291
|
+
<p>It may also react to queue depths, e.g. temporarily reallocating idle
|
292
|
+
workers to overloaded queues or shutting them down to conserve memory,
|
293
|
+
or actively managing sudden short peak usage by stopping other workers
|
294
|
+
and switching them to peaking queue.</p>
|
295
|
+
|
296
|
+
<p>It may also simply allocate workers dynamically based on time of day,
|
297
|
+
to e.g. have more workers performing UI-related task in the day, which
|
298
|
+
increases perceived responsiveness, and switch them to process
|
299
|
+
long-running reports overnight when there are less users.</p>
|
300
|
+
|
301
|
+
<h2 id="detailed-documentation-and-source-code">Detailed documentation and source code</h2>
|
302
|
+
|
303
|
+
<ul>
|
304
|
+
<li>http://rubydoc.info/FIXME</li>
|
305
|
+
<li>http://github.com/mpasternacki/resque-pool-dynamic</li>
|
306
|
+
</ul>
|
307
|
+
</div></div>
|
308
|
+
|
309
|
+
<div id="footer">
|
310
|
+
Generated on Wed Apr 25 21:03:02 2012 by
|
311
|
+
<a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
312
|
+
0.7.5 (ruby-1.9.2).
|
313
|
+
</div>
|
314
|
+
|
315
|
+
</body>
|
316
|
+
</html>
|