Skip to content

Commit 77f8454

Browse files
author
Matt George
committed
updated with some tests
1 parent d9244d1 commit 77f8454

File tree

2 files changed

+61
-16
lines changed

2 files changed

+61
-16
lines changed

pyres/horde.py

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,6 @@ def __init__(self, pool_size=5, queues=[], server='localhost:6379', password=Non
154154
self._workers = OrderedDict()
155155
self.server = server
156156
self.password = password
157-
158157
#self._workers = list()
159158

160159
def setup_resq(self):
@@ -196,15 +195,12 @@ def add_child(self, signum, frame):
196195
def register_khan(self):
197196
if not hasattr(self, 'resq'):
198197
self.setup_resq()
199-
200198
self.resq.redis.sadd('resque:khans',str(self))
201199
self.started = datetime.datetime.now()
202200

203201
def _check_commands(self):
204202
if not self._shutdown:
205203
logging.debug('Checking commands')
206-
command_key = 'resque:khan:%s' % self
207-
208204
command = self.resq.redis.lpop('resque:khan:%s' % str(self))
209205
logging.debug('COMMAND FOUND: %s ' % command)
210206
if command:
@@ -223,15 +219,17 @@ def process_command(self, command):
223219

224220
def add_minion(self):
225221
m = self._add_minion()
226-
m.start()
222+
self.resq.redis.srem('resque:khans',str(self))
223+
self.pool_size += 1
224+
self.resq.redis.sadd('resque:khans',str(self))
227225

228226
def _add_minion(self):
229227
logging.info('Adding minion')
230-
#parent_conn, child_conn = multiprocessing.Pipe()
231228
m = Minion(self.queues, self.server, self.password)
232-
#m.start()
229+
m.start()
230+
self._workers[m.pid] = m
231+
logging.info('minion added at: %s' % m.pid)
233232
return m
234-
#self._workers.append(m)
235233

236234
def _shutdown_minions(self):
237235
"""
@@ -246,20 +244,23 @@ def _remove_minion(self, pid=None):
246244
# m = self._workers.pop(pid)
247245
pid, m = self._workers.popitem(False)
248246
m.terminate()
247+
self.resq.redis.srem('resque:khans',str(self))
248+
self.pool_size -= 1
249+
self.resq.redis.sadd('resque:khans',str(self))
249250
return m
250251

251252
def unregister_khan(self):
252253
logging.debug('unregistering khan')
253254
self.resq.redis.srem('resque:khans',str(self))
254255
self.started = None
255256

257+
def setup_minions(self):
258+
for i in range(self.pool_size):
259+
self._add_minion()
260+
256261
def work(self, interval=2):
257262
self.startup()
258-
for i in range(self.pool_size):
259-
m = self._add_minion()
260-
m.start()
261-
self._workers[m.pid] = m
262-
logging.info('minion added at %s' % m.pid)
263+
self.setup_minions()
263264
self.setup_resq()
264265
self.register_khan()
265266
while True:
@@ -275,7 +276,7 @@ def work(self, interval=2):
275276

276277
def __str__(self):
277278
hostname = os.uname()[1]
278-
return '%s:%s' % (hostname, self.pid)
279+
return '%s:%s:%s' % (hostname, self.pid, self.pool_size)
279280

280281
@classmethod
281282
def run(cls, pool_size=5, queues=[], server='localhost:6379'):

tests/test_horde.py

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,49 @@ def test_khan_init(self):
1111
def test_register_khan(self):
1212
khan = horde.Khan(pool_size=1, queues=['basic'])
1313
khan.register_khan()
14-
name = "%s:%s" % (os.uname()[1],os.getpid())
15-
assert self.redis.sismember('resque:khans',name)
14+
name = "%s:%s:1" % (os.uname()[1],os.getpid())
15+
assert self.redis.sismember('resque:khans',name)
16+
17+
def test_unregister_khan(self):
18+
khan = horde.Khan(pool_size=1, queues=['basic'])
19+
khan.register_khan()
20+
name = "%s:%s:1" % (os.uname()[1],os.getpid())
21+
assert self.redis.sismember('resque:khans',name)
22+
assert self.redis.scard('resque:khans') == 1
23+
khan.unregister_khan()
24+
assert not self.redis.sismember('resque:khans', name)
25+
assert self.redis.scard('resque:khans') == 0
26+
27+
def test_setup_minions(self):
28+
khan = horde.Khan(pool_size=1, queues=['basic'])
29+
khan.setup_minions()
30+
assert len(khan._workers) == 1
31+
khan._shutdown_minions()
32+
33+
def test_setup_resq(self):
34+
khan = horde.Khan(pool_size=1, queues=['basic'])
35+
assert not hasattr(khan, 'resq')
36+
khan.setup_resq()
37+
assert hasattr(khan, 'resq')
38+
39+
def test_add_minion(self):
40+
khan = horde.Khan(pool_size=1, queues=['basic'])
41+
khan.setup_minions()
42+
khan.register_khan()
43+
name = "%s:%s:1" % (os.uname()[1],os.getpid())
44+
assert self.redis.sismember('resque:khans',name)
45+
khan.add_minion()
46+
assert len(khan._workers) == 2
47+
assert not self.redis.sismember('resque:khans',name)
48+
name = '%s:%s:2' % (os.uname()[1], os.getpid())
49+
assert khan.pool_size == 2
50+
assert self.redis.sismember('resque:khans',name)
51+
khan._shutdown_minions()
52+
53+
def test_remove_minion(self):
54+
khan = horde.Khan(pool_size=1, queues=['basic'])
55+
khan.setup_minions()
56+
khan.register_khan()
57+
assert khan.pool_size == 1
58+
khan._remove_minion()
59+
assert khan.pool_size == 0

0 commit comments

Comments
 (0)