16
16
from signal import Signals
17
17
from typing import Dict , List , Type # noqa
18
18
19
+ from async_timeout import timeout
20
+
19
21
from .drain import Drain
20
22
from .jobs import ArqError , Job
21
23
from .logs import default_log_config
25
27
__all__ = ['BaseWorker' , 'RunWorkerProcess' , 'StopJob' , 'import_string' ]
26
28
27
29
work_logger = logging .getLogger ('arq.work' )
30
+ ctrl_logger = logging .getLogger ('arq.control' )
28
31
jobs_logger = logging .getLogger ('arq.jobs' )
29
32
30
33
@@ -173,9 +176,10 @@ async def run(self):
173
176
perform jobs.
174
177
"""
175
178
self ._stopped = False
176
- work_logger .info ('Initialising work manager, burst mode: %s' , self ._burst_mode )
179
+ work_logger .info ('Initialising work manager, burst mode: %s, creating shadows... ' , self ._burst_mode )
177
180
178
- shadows = await self .shadow_factory ()
181
+ with timeout (10 ):
182
+ shadows = await self .shadow_factory ()
179
183
assert isinstance (shadows , list ), 'shadow_factory should return a list not %s' % type (shadows )
180
184
self .job_class = shadows [0 ].job_class
181
185
work_logger .debug ('Using first shadows job class "%s"' , self .job_class .__name__ )
@@ -416,8 +420,8 @@ def start_worker(worker_path: str, worker_class: str, burst: bool, loop: asyncio
416
420
:param loop: asyncio loop use to or None
417
421
"""
418
422
worker_cls = import_string (worker_path , worker_class )
419
- worker = worker_cls (burst = burst , loop = loop )
420
423
work_logger .info ('Starting "%s" on pid=%d' , worker_cls .__name__ , os .getpid ())
424
+ worker = worker_cls (burst = burst , loop = loop )
421
425
try :
422
426
worker .run_until_complete ()
423
427
except HandledExit :
@@ -444,32 +448,32 @@ def __init__(self, worker_path, worker_class, burst=False):
444
448
445
449
def run_worker (self , worker_path , worker_class , burst ):
446
450
name = 'WorkProcess'
447
- work_logger .info ('starting work process "%s"' , name )
451
+ ctrl_logger .info ('starting work process "%s"' , name )
448
452
self .process = Process (target = start_worker , args = (worker_path , worker_class , burst ), name = name )
449
453
self .process .start ()
450
454
self .process .join ()
451
455
if self .process .exitcode == 0 :
452
- work_logger .info ('worker process exited ok' )
456
+ ctrl_logger .info ('worker process exited ok' )
453
457
return
454
- work_logger .critical ('worker process %s exited badly with exit code %s' ,
458
+ ctrl_logger .critical ('worker process %s exited badly with exit code %s' ,
455
459
self .process .pid , self .process .exitcode )
456
460
sys .exit (3 )
457
461
# could restart worker here, but better to leave it up to the real manager eg. docker restart: always
458
462
459
463
def handle_sig (self , signum , frame ):
460
464
signal .signal (signal .SIGINT , self .handle_sig_force )
461
465
signal .signal (signal .SIGTERM , self .handle_sig_force )
462
- work_logger .info ('got signal: %s, waiting for worker pid=%s to finish...' , Signals (signum ).name ,
466
+ ctrl_logger .info ('got signal: %s, waiting for worker pid=%s to finish...' , Signals (signum ).name ,
463
467
self .process and self .process .pid )
464
468
# sleep to make sure worker.handle_sig above has executed if it's going to and detached handle_proxy_signal
465
469
time .sleep (0.01 )
466
470
if self .process and self .process .is_alive ():
467
- work_logger .debug ("sending custom shutdown signal to worker in case it didn't receive the signal" )
471
+ ctrl_logger .debug ("sending custom shutdown signal to worker in case it didn't receive the signal" )
468
472
os .kill (self .process .pid , SIG_PROXY )
469
473
470
474
def handle_sig_force (self , signum , frame ):
471
- work_logger .warning ('got signal: %s again, forcing exit' , Signals (signum ).name )
475
+ ctrl_logger .warning ('got signal: %s again, forcing exit' , Signals (signum ).name )
472
476
if self .process and self .process .is_alive ():
473
- work_logger .error ('sending worker %d SIGTERM' , self .process .pid )
477
+ ctrl_logger .error ('sending worker %d SIGTERM' , self .process .pid )
474
478
os .kill (self .process .pid , signal .SIGTERM )
475
479
raise ImmediateExit ('force exit' )
0 commit comments