24
24
from scheduler .types import ConnectionType , TimeoutErrorTypes , ConnectionErrorTypes , WatchErrorTypes , ResponseErrorTypes
25
25
from .commands import WorkerCommandsChannelListener
26
26
from .scheduler import WorkerScheduler , SchedulerStatus
27
+ from ..helpers .queues .getters import refresh_queue_connection
27
28
from ..redis_models .lock import QueueLock
28
29
from ..redis_models .worker import WorkerStatus
29
30
@@ -116,14 +117,14 @@ def __init__(
116
117
self .job_monitoring_interval : int = job_monitoring_interval
117
118
self .maintenance_interval = maintenance_interval
118
119
119
- connection = self ._set_connection (connection )
120
- self .connection = connection
120
+ self .connection = self ._set_connection (connection )
121
121
122
122
self .queues = [
123
123
(Queue (name = q , connection = connection ) if isinstance (q , str ) else q ) for q in _ensure_list (queues )
124
124
]
125
125
self .name : str = name
126
- self ._validate_name_uniqueness ()
126
+ if model is None :
127
+ self ._validate_name_uniqueness ()
127
128
self ._ordered_queues = self .queues [:]
128
129
129
130
self ._is_job_execution_process : bool = False
@@ -155,6 +156,9 @@ def __init__(
155
156
156
157
@property
157
158
def _pid (self ) -> int :
159
+ if self ._model is None :
160
+ logger .debug (f"[Worker { self .name } ]: Worker model is None, returning 0 as PID" )
161
+ return 0
158
162
return self ._model .pid
159
163
160
164
def should_run_maintenance_tasks (self ) -> bool :
@@ -600,16 +604,19 @@ def fork_job_execution_process(self, job: JobModel, queue: Queue) -> None:
600
604
os .environ ["SCHEDULER_JOB_NAME" ] = job .name
601
605
if child_pid == 0 : # Child process/Job executor process to run the job
602
606
os .setsid ()
603
- self ._model .job_execution_process_pid = os .getpid ()
604
- self ._model .save (connection = self .connection )
605
- self .execute_in_separate_process (job , queue )
607
+ refresh_queue_connection (queue )
608
+ self .connection = queue .connection
609
+ self ._model .set_field ("job_execution_process_pid" , os .getpid (), connection = queue .connection )
610
+ worker = Worker .from_model (self ._model )
611
+ worker .execute_in_separate_process (job , queue )
606
612
os ._exit (0 ) # just in case
607
613
else : # Parent worker process
608
614
logger .debug (
609
615
f"[Worker { self .name } /{ self ._pid } ]: Forking job execution process, job_execution_process_pid={ child_pid } "
610
616
)
617
+ refresh_queue_connection (queue )
611
618
self ._model .job_execution_process_pid = child_pid
612
- self ._model .save (connection = self .connection )
619
+ self ._model .save (connection = queue .connection )
613
620
self .procline (f"Forked { child_pid } at { time .time ()} " )
614
621
615
622
def get_heartbeat_ttl (self , job : JobModel ) -> int :
@@ -732,6 +739,7 @@ def execute_in_separate_process(self, job: JobModel, queue: Queue) -> None:
732
739
random .seed ()
733
740
self .setup_job_execution_process_signals ()
734
741
self ._is_job_execution_process = True
742
+ job = JobModel .get (job .name , self .connection )
735
743
try :
736
744
self .perform_job (job , queue )
737
745
except : # noqa
@@ -756,7 +764,7 @@ def worker_before_execution(self, job: JobModel, connection: ConnectionType) ->
756
764
self ._model .current_job_working_time = 0
757
765
self ._model .job_execution_process_pid = current_pid
758
766
heartbeat_ttl = self .get_heartbeat_ttl (job )
759
- self ._model .heartbeat (self . connection , heartbeat_ttl )
767
+ self ._model .heartbeat (connection , heartbeat_ttl )
760
768
self .procline (
761
769
f"[Worker { self .name } /{ self ._pid } ]: Processing { job .func_name } from { job .queue_name } since { time .time ()} "
762
770
)
@@ -792,7 +800,7 @@ def handle_job_success(self, job: JobModel, return_value: Any, queue: Queue) ->
792
800
self ._model .completed_jobs += 1
793
801
if job .started_at is not None and job .ended_at is not None :
794
802
self ._model .total_working_time_ms += (job .ended_at - job .started_at ).microseconds / 1000.0
795
- self ._model .save (connection = self . connection )
803
+ self ._model .save (connection = pipeline )
796
804
797
805
job .expire (job .success_ttl , connection = pipeline )
798
806
logger .debug (f"[Worker { self .name } /{ self ._pid } ]: Removing job { job .name } from active_job_registry" )
0 commit comments