@@ -36,7 +36,7 @@ class BadJob(Exception):
36
36
37
37
38
38
# special signal sent by the main process in case the worker process hasn't received a signal (eg. SIGTERM or SIGINT)
39
- SIG_SUPERVISOR = signal .SIGRTMIN + 7
39
+ SIG_PROXY = signal .SIGRTMIN + 7
40
40
41
41
42
42
class BaseWorker (RedisMixin ):
@@ -84,7 +84,7 @@ def __init__(self, *,
84
84
self .job_class = None # type: type # TODO
85
85
signal .signal (signal .SIGINT , self .handle_sig )
86
86
signal .signal (signal .SIGTERM , self .handle_sig )
87
- signal .signal (SIG_SUPERVISOR , self .handle_supervisor_signal )
87
+ signal .signal (SIG_PROXY , self .handle_proxy_signal )
88
88
super ().__init__ (** kwargs ) # type: ignore # TODO
89
89
self ._closing_lock = asyncio .Lock (loop = self .loop )
90
90
@@ -160,7 +160,7 @@ async def run(self, reuse=False):
160
160
finally :
161
161
if reuse :
162
162
work_logger .info ('waiting for %d jobs to finish' , len (self ._pending_tasks ))
163
- await asyncio .gather ( * self ._pending_tasks , loop = self .loop )
163
+ await asyncio .wait ( self ._pending_tasks , loop = self .loop )
164
164
else :
165
165
await self .close ()
166
166
if self ._task_exception :
@@ -186,28 +186,28 @@ async def work(self):
186
186
work_logger .debug ('got job from the quit queue, stopping' )
187
187
break
188
188
queue = queue_lookup [raw_queue ]
189
- await self .schedule_job (data , queue , raw_queue )
189
+ self .schedule_job (data , queue )
190
+ await self .below_concurrency_limit ()
190
191
191
- async def schedule_job (self , data , queue , raw_queue ):
192
+ def schedule_job (self , data , queue ):
192
193
work_logger .debug ('scheduling job from queue %s' , queue )
193
194
job = self .job_class (queue , data )
194
195
195
- pt_cnt = len (self ._pending_tasks )
196
- if pt_cnt >= self .max_concurrent_tasks :
197
- work_logger .debug ('%d pending tasks, waiting for one to finish before creating task for %s' , pt_cnt , job )
198
- _ , self ._pending_tasks = await asyncio .wait (self ._pending_tasks , loop = self .loop ,
199
- return_when = asyncio .FIRST_COMPLETED )
200
-
201
- if not self .running :
202
- work_logger .warning ('job popped from queue, but exit is imminent, re-queueing the job' )
203
- async with await self .get_redis_conn () as redis :
204
- await redis .lpush (raw_queue , data )
205
- return
206
196
task = self .loop .create_task (self .run_job (job ))
207
197
task .add_done_callback (self .job_callback )
208
198
self .loop .call_later (self .timeout_seconds , self .cancel_job , task , job )
209
199
self ._pending_tasks .add (task )
210
200
201
+ async def below_concurrency_limit (self ):
202
+ pt_cnt = len (self ._pending_tasks )
203
+ while True :
204
+ if pt_cnt < self .max_concurrent_tasks :
205
+ return
206
+ work_logger .debug ('%d pending tasks, waiting for one to finish' , pt_cnt )
207
+ _ , self ._pending_tasks = await asyncio .wait (self ._pending_tasks , loop = self .loop ,
208
+ return_when = asyncio .FIRST_COMPLETED )
209
+ pt_cnt = len (self ._pending_tasks )
210
+
211
211
def cancel_job (self , task , job ):
212
212
if not task .cancel ():
213
213
return
@@ -290,9 +290,9 @@ async def close(self):
290
290
await super ().close ()
291
291
self ._closed = True
292
292
293
- def handle_supervisor_signal (self , signum , frame ):
293
+ def handle_proxy_signal (self , signum , frame ):
294
294
self .running = False
295
- work_logger .warning ('pid=%d, got shutdown signal from main process, stopping...' , os .getpid ())
295
+ work_logger .warning ('pid=%d, got signal proxied from main process, stopping...' , os .getpid ())
296
296
signal .signal (signal .SIGINT , self .handle_sig_force )
297
297
signal .signal (signal .SIGTERM , self .handle_sig_force )
298
298
signal .signal (signal .SIGALRM , self .handle_sig_force )
@@ -302,7 +302,7 @@ def handle_supervisor_signal(self, signum, frame):
302
302
def handle_sig (self , signum , frame ):
303
303
self .running = False
304
304
work_logger .warning ('pid=%d, got signal: %s, stopping...' , os .getpid (), Signals (signum ).name )
305
- signal .signal (SIG_SUPERVISOR , signal .SIG_IGN )
305
+ signal .signal (SIG_PROXY , signal .SIG_IGN )
306
306
signal .signal (signal .SIGINT , self .handle_sig_force )
307
307
signal .signal (signal .SIGTERM , self .handle_sig_force )
308
308
signal .signal (signal .SIGALRM , self .handle_sig_force )
@@ -392,11 +392,11 @@ def handle_sig(self, signum, frame):
392
392
signal .signal (signal .SIGTERM , self .handle_sig_force )
393
393
work_logger .warning ('got signal: %s, waiting for worker pid=%s to finish...' , Signals (signum ).name ,
394
394
self .process and self .process .pid )
395
- # sleep to make sure handle_sig above has executed if it's going to and detached handle_supervisor_signal
395
+ # sleep to make sure worker. handle_sig above has executed if it's going to and detached handle_proxy_signal
396
396
time .sleep (0.01 )
397
397
if self .process and self .process .is_alive ():
398
398
work_logger .debug ("sending custom shutdown signal to worker in case it didn't receive the signal" )
399
- os .kill (self .process .pid , SIG_SUPERVISOR )
399
+ os .kill (self .process .pid , SIG_PROXY )
400
400
401
401
def handle_sig_force (self , signum , frame ):
402
402
work_logger .error ('got signal: %s again, forcing exit' , Signals (signum ).name )
0 commit comments