@@ -17,10 +17,10 @@ def setproctitle(name):
1717class Worker (object ):
1818 """Defines a worker. The ``pyres_worker`` script instantiates this Worker class and
1919 passes a comma-separated list of queues to listen on.::
20-
20+
2121 >>> from pyres.worker import Worker
2222 >>> Worker.run([queue1, queue2], server="localhost:6379")
23-
23+
2424 """
2525 def __init__ (self , queues = [], server = "localhost:6379" , password = None ):
2626 self .queues = queues
@@ -35,40 +35,40 @@ def __init__(self, queues=[], server="localhost:6379", password=None):
3535 self .resq = server
3636 else :
3737 raise Exception ("Bad server argument" )
38-
39-
38+
39+
4040 def validate_queues (self ):
4141 """Checks if a worker is given at least one queue to work on."""
4242 if not self .queues :
4343 raise NoQueueError ("Please give each worker at least one queue." )
44-
44+
4545 def register_worker (self ):
4646 self .resq .redis .sadd ('resque:workers' ,str (self ))
4747 #self.resq._redis.add("worker:#{self}:started", Time.now.to_s)
4848 self .started = datetime .datetime .now ()
49-
49+
5050 def _set_started (self , dt ):
5151 if dt :
5252 key = int (time .mktime (dt .timetuple ()))
5353 self .resq .redis .set ("resque:worker:%s:started" % self , key )
5454 else :
5555 self .resq .redis .delete ("resque:worker:%s:started" % self )
56-
56+
5757 def _get_started (self ):
5858 datestring = self .resq .redis .get ("resque:worker:%s:started" % self )
5959 #ds = None
6060 #if datestring:
6161 # ds = datetime.datetime.strptime(datestring, '%Y-%m-%d %H:%M:%S')
6262 return datestring
63-
63+
6464 started = property (_get_started , _set_started )
65-
65+
6666 def unregister_worker (self ):
6767 self .resq .redis .srem ('resque:workers' ,str (self ))
6868 self .started = None
6969 Stat ("processed:%s" % self , self .resq ).clear ()
7070 Stat ("failed:%s" % self , self .resq ).clear ()
71-
71+
7272 def prune_dead_workers (self ):
7373 all_workers = Worker .all (self .resq )
7474 known_workers = self .worker_pids ()
@@ -85,20 +85,20 @@ def startup(self):
8585 self .register_signal_handlers ()
8686 self .prune_dead_workers ()
8787 self .register_worker ()
88-
88+
8989 def register_signal_handlers (self ):
9090 signal .signal (signal .SIGTERM , self .shutdown_all )
9191 signal .signal (signal .SIGINT , self .shutdown_all )
9292 signal .signal (signal .SIGQUIT , self .schedule_shutdown )
9393 signal .signal (signal .SIGUSR1 , self .kill_child )
94-
94+
9595 def shutdown_all (self , signum , frame ):
9696 self .schedule_shutdown (signum , frame )
9797 self .kill_child (signum , frame )
98-
98+
9999 def schedule_shutdown (self , signum , frame ):
100100 self ._shutdown = True
101-
101+
102102 def kill_child (self , signum , frame ):
103103 if self .child :
104104 logging .info ("Killing child at %s" % self .child )
@@ -108,19 +108,19 @@ def __str__(self):
108108 if getattr (self ,'id' , None ):
109109 return self .id
110110 return '%s:%s:%s' % (self .hostname , self .pid , ',' .join (self .queues ))
111-
111+
112112 def work (self , interval = 5 ):
113113 """Invoked by ``run`` method. ``work`` listens on a list of queues and sleeps
114- for ``interval`` time.
115-
114+ for ``interval`` time.
115+
116116 ``interval`` -- Number of seconds the worker will wait until processing the next job. Default is "5".
117-
117+
118118 Whenever a worker finds a job on the queue it first calls ``reserve`` on
119- that job to make sure another worker won't run it, then *forks* itself to
119+ that job to make sure another worker won't run it, then *forks* itself to
120120 work on that job.
121-
121+
122122 Finally, the ``process`` method actually processes the job by eventually calling the Job instance's ``perform`` method.
123-
123+
124124 """
125125 setproctitle ('pyres_worker-%s: Starting' % __version__ )
126126 self .startup ()
@@ -157,7 +157,7 @@ def work(self, interval=5):
157157 setproctitle ("pyres_worker-%s: Waiting for %s " % (__version__ , ',' .join (self .queues )))
158158 time .sleep (interval )
159159 self .unregister_worker ()
160-
160+
161161 def process (self , job = None ):
162162 if not job :
163163 job = self .reserve ()
@@ -174,15 +174,15 @@ def process(self, job=None):
174174 logging .debug ('job details: %s' % job )
175175 finally :
176176 self .done_working ()
177-
177+
178178 def reserve (self ):
179179 for q in self .queues :
180180 logging .debug ('checking queue %s' % q )
181181 job = Job .reserve (q , self .resq , self .__str__ ())
182182 if job :
183183 logging .info ('Found job on %s' % q )
184184 return job
185-
185+
186186 def working_on (self , job ):
187187 logging .debug ('marking as working on' )
188188 data = {
@@ -194,38 +194,38 @@ def working_on(self, job):
194194 self .resq .redis ["resque:worker:%s" % str (self )] = data
195195 logging .debug ("worker:%s" % str (self ))
196196 logging .debug (self .resq .redis ["resque:worker:%s" % str (self )])
197-
197+
198198 def done_working (self ):
199199 logging .info ('done working' )
200200 self .processed ()
201201 self .resq .redis .delete ("resque:worker:%s" % str (self ))
202-
202+
203203 def processed (self ):
204204 total_processed = Stat ("processed" , self .resq )
205205 worker_processed = Stat ("processed:%s" % str (self ), self .resq )
206206 total_processed .incr ()
207207 worker_processed .incr ()
208-
208+
209209 def get_processed (self ):
210210 return Stat ("processed:%s" % str (self ), self .resq ).get ()
211-
211+
212212 def failed (self ):
213213 Stat ("failed" , self .resq ).incr ()
214214 Stat ("failed:%s" % self , self .resq ).incr ()
215-
215+
216216 def get_failed (self ):
217217 return Stat ("failed:%s" % self , self .resq ).get ()
218-
218+
219219 def job (self ):
220220 data = self .resq .redis .get ("resque:worker:%s" % self )
221221 if data :
222222 return ResQ .decode (data )
223223 return {}
224224
225-
225+
226226 def processing (self ):
227227 return self .job ()
228-
228+
229229 def state (self ):
230230 return 'working' if self .resq .redis .exists ('resque:worker:%s' % self ) else 'idle'
231231
@@ -235,32 +235,32 @@ def worker_pids(self):
235235 return map (lambda l : l .strip ().split (' ' )[0 ],
236236 commands .getoutput ("ps -A -o pid,command | \
237237 grep pyres_worker" ).split ("\n " ))
238-
238+
239239 @classmethod
240240 def run (cls , queues , server = "localhost:6379" , interval = None ):
241241 worker = cls (queues = queues , server = server )
242242 if interval is not None :
243- worker .work (interval )
243+ worker .work (interval )
244244 else :
245245 worker .work ()
246-
246+
247247 @classmethod
248248 def all (cls , host = "localhost:6379" ):
249249 if isinstance (host ,basestring ):
250250 resq = ResQ (host )
251251 elif isinstance (host , ResQ ):
252252 resq = host
253-
253+
254254 return [Worker .find (w ,resq ) for w in resq .redis .smembers ('resque:workers' ) or []]
255-
255+
256256 @classmethod
257257 def working (cls , host ):
258258 if isinstance (host , basestring ):
259259 resq = ResQ (host )
260260 elif isinstance (host , ResQ ):
261261 resq = host
262262 total = []
263- for key in Worker .all (host ):
263+ for key in Worker .all (host ):
264264 total .append ('resque:worker:%s' % key )
265265 names = []
266266 for key in total :
@@ -269,7 +269,7 @@ def working(cls, host):
269269 w = Worker .find (key [14 :], resq ) #resque:worker:
270270 names .append (w )
271271 return names
272-
272+
273273 @classmethod
274274 def find (cls , worker_id , resq ):
275275 if Worker .exists (worker_id , resq ):
@@ -279,11 +279,11 @@ def find(cls, worker_id, resq):
279279 return worker
280280 else :
281281 return None
282-
282+
283283 @classmethod
284284 def exists (cls , worker_id , resq ):
285285 return resq .redis .sismember ('resque:workers' , worker_id )
286-
286+
287287
288288if __name__ == "__main__" :
289289 from optparse import OptionParser
0 commit comments