
    (ph8                        S SK r S SKrS SKrS SKrS SKJrJrJrJr  S SK	J
r
  S SKJrJr  S SKJr   \R                   " 5         S SKJr  S SKJr  S SKJrJr  S S	KJrJrJrJ r J!r!J"r"  S S
K#J$r$  S SK%J&r&  S SK'J(r(  S SK)J*r*  S SK+J,r,  S SK-J.r.J/r/  S SK0J1r1   " S S5      r2 " S S5      r3\Rh                  (       + 4S\5S\6S\74S jjr8g! \R"                  R$                   a    S SKr\R&                  " 5          Nf = f)    N)EventProcessValuecurrent_process)sleep)coredb)apps)timezone)gettext_lazy)Broker
get_broker)Confget_ppidloggerprometheus_multiprocesspsutilsetproctitle)humanize)monitor)pusher)Queue)	scheduler)StatStatus)workerc                       \ rS rSrSS\4S jjrS\4S jrS\4S jr	S r
\S\4S	 j5       r\S\4S
 j5       r\S\4S j5       r\S\4S j5       r\S\4S j5       r\S\4S j5       rSrg)Cluster*   Nbrokerc                    Xl         S U l        S U l        S U l        [	        5       R
                  U l        [        R                  " 5       U l        [        R                  " 5       U l        S U l        [        R                  " [        R                  U R                  5        [        R                  " [        R                   U R                  5        g N)r    sentinel
stop_eventstart_eventr   piduuiduuid4
cluster_idsocketgethostnamehosttimeoutsignalSIGTERMsig_handlerSIGINT)selfr    s     C/var/www/html/venv/lib/python3.13/site-packages/django_q/cluster.py__init__Cluster.__init__+   s     "$((**,&&(	fnnd&6&67fmmT%5%56    returnc           	         [         (       a8  [         R                   " S[        5       R                   SU R                   35        [        5       U l        [        5       U l        [        [        S[        R                  " 5       R                   3U R                  U R
                  U R                  U R                  U R                  4S9U l        U R                  R                  5         [         R"                  " [%        S5      SU R                  0-  5        U R
                  R'                  5       (       d,  [)        S5        U R
                  R'                  5       (       d  M,  U R*                  $ )Nz	qcluster  Process-)targetnameargszQ Cluster %(name)s starting.r<   皙?)r   r   r<   r   r$   r%   r   Sentinelr'   r(   hexr)   r    r-   r#   startr   info_is_setr   r&   r2   s    r3   rA   Cluster.start9   s   <%%	/2C2H2H1I499+&VW' 7DJJL,,-.  

 	A458KKL""))++#J ""))++xxr6   c                    U R                   R                  5       (       d  g[        R                  " [	        S5      SU R
                  0-  5        U R                  R                  5         U R                   R                  5         [        R                  " [	        S5      SU R
                  0-  5        S U l	        S U l        g)NFzQ Cluster %(name)s stopping.r<   zQ Cluster %(name)s has stopped.T)
r#   is_aliver   rB   rC   r<   r$   setjoinr%   rE   s    r3   stopCluster.stopP   s    }}%%''A458KKLA78FDII;NNOr6   c                     [         R                  " [        S5      [        5       R                  [
        R                  R                  US5      S.-  5        U R                  5         g )Nz%(name)s got signal %(signal)sUNKNOWN)r<   r.   )	r   debugrC   r   r<   r   SIGNAL_NAMESgetrK   )r2   signumframes      r3   r0   Cluster.sig_handler[   sN    ./')..++//	B	
 			r6   c                     U R                   (       a)  [        R                  " U R                  U R                  S9$ [        U R                  U R                  S9$ )N)r&   r)   )r#   r   rQ   r&   r)   r   rE   s    r3   statCluster.state   s7    ==88T__EE$((t??r6   c                 @    [        U R                  R                  5      $ r"   )r   r)   r@   rE   s    r3   r<   Cluster.namek   s    ++,,r6   c                     U R                   =(       a2    U R                  =(       a    U R                  R                  5       (       + $ r"   r$   r%   rD   rE   s    r3   is_startingCluster.is_startingo   s.    U4#3#3UD<L<L<S<S<U8UUr6   c                     U R                   =(       a-    U R                  =(       a    U R                  R                  5       $ r"   r[   rE   s    r3   
is_runningCluster.is_runnings   s+    Q4#3#3Q8H8H8O8O8QQr6   c                     U R                   =(       aN    U R                  =(       a;    U R                  R                  5       =(       a    U R                   R                  5       $ r"   r[   rE   s    r3   is_stoppingCluster.is_stoppingw   sL     OO )  )  '')) &&(		
r6   c                 n    U R                   S L =(       a!    U R                  S L =(       a    U R                  $ r"   )r%   r$   r#   rE   s    r3   has_stoppedCluster.has_stopped   s*    4'UDOOt,CUUr6   )r    r)   r,   r&   r#   r%   r$   r-   r"   )__name__
__module____qualname____firstlineno__r   r4   intrA   boolrK   r0   propertyr   rV   strr<   r\   r_   rb   re   __static_attributes__ r6   r3   r   r   *   s    7v 7s .	d 	 @f @ @
 -c - - VT V V RD R R 
T 
 
 VT V Vr6   r   c                       \ rS rSr   SS jrS rS rS\4S jrS\	4S jr
S\	4S	 jrS
 rS\	4S jrS rS rS rS rSrg)r?      Nc                 Z   [         R                   " [         R                  [         R                  5        [         R                   " [         R                  [         R                  5        [        5       R                  U l        X0l        [        5       U l	        [        5       R                  U l
        U=(       d
    [        5       U l        SU l        [        R                  " 5       U l        Xl        X l        [&        R(                  U l        / U l        U=(       d    [&        R.                  U l        [&        R2                  (       a  [5        [&        R2                  S9O	[5        5       U l        [5        5       U l        [;        5       U l        S U l        S U l         U(       a  U RC                  5         g g )Nr   )maxsize)"r.   r1   SIG_IGNr/   SIG_DFLr   r&   r)   r   
parent_pidr<   r   r    reincarnationsr   nowtobr$   r%   r   WORKERS	pool_sizepoolTIMEOUTr-   QUEUE_LIMITr   
task_queueresult_queuer   	event_outr   r   rA   )r2   r$   r%   r)   r    r-   rA   s          r3   r4   Sentinel.__init__   s    	fmmV^^4fnnfnn5"$(($"*#%**	,
<<>$&	.$,,/3/?/?E$**+UW 	 "GJJL r6   c                 T    U R                   (       a  U R                   R                  $ S$ )Nz--)r    list_keyrE   s    r3   
queue_nameSentinel.queue_name   s    '+{{t{{##<<r6   c                 x    U R                   R                  5         U R                  5         U R                  5         g r"   )r    pingspawn_clusterguardrE   s    r3   rA   Sentinel.start   s'    

r6   r7   c                 D   U R                   R                  5       (       d/  U R                  R                  5       (       d  [        R                  $ U R                   R                  5       (       a}  U R                  R                  5       (       d^  U R
                  R                  5       (       a/  U R                  R                  5       (       a  [        R                  $ [        R                  $ U R                  R                  5       (       a  U R                   R                  5       (       aw  U R                  R                  5       (       d8  U R                  R                  5       (       d  [        U R                  5      S:  a  [        R                  $ [        R                   $ g g )Nr   )r%   rD   r$   r   STARTINGr   emptyr   IDLEWORKINGr   rH   r   lenr}   STOPPINGSTOPPEDrE   s    r3   statusSentinel.status   s   &&((1G1G1I1I== $$&&t/E/E/G/G  &&((T__-B-B-D-Dyy <<__##%%$*:*:*A*A*C*C||$$&&$++*>*>*@*@C		NUVDV}}$<< +D%r6   c                    [        XS[        R                  " 5       R                   3S9nSUl        U[
        :X  a:  [        R                  Ul        US   Ul        U R                  R                  U5        UR                  5         U$ )z!
:type target: function or class
r:   )r;   r=   r<   T   )r   r'   r(   r@   daemonr   r   DAEMONIZE_WORKERStimerr}   appendrA   )r2   r;   r=   ps       r3   spawn_processSentinel.spawn_process   sk     6Xdjjl>N>N=O3PQV--AH1gAGIIQ		r6   c                 n    U R                  [        U R                  U R                  U R                  5      $ r"   )r   r   r   r   r    rE   s    r3   spawn_pusherSentinel.spawn_pusher   s%    !!&$//4>>4;;WWr6   c           	          U R                  [        U R                  U R                  [	        SS5      U R
                  5        g )Nf)r   r   r   r   r   r-   rE   s    r3   spawn_workerSentinel.spawn_worker   s/    DOOT%6%6c2	
r6   c                 X    U R                  [        U R                  U R                  5      $ r"   )r   r   r   r    rE   s    r3   spawn_monitorSentinel.spawn_monitor   s!    !!'4+<+<dkkJJr6   c                    [         R                  (       d  [        R                  R	                  5         XR
                  :X  aE  U R                  5       U l        [        R                  " [        S5      SUR                  0-  5        GOFXR                  :X  aE  U R                  5       U l        [        R                  " [        S5      SUR                  0-  5        GO[        R                  " S[        R                  " S5      5      n[        (       a'  U(       a   [        R                   " UR"                  5        U R$                  R'                  U5        U R)                  5         UR*                  R,                  S:X  a  Sn[.        (       a_   [.        R0                  " UR"                  5      R                  5       nUR3                  S5      n[5        U5      S	:  a  US
   S:X  a  US   OSnUR9                  5         U(       a  [        S5      UR                  US.-  nO[        S5      SUR                  0-  n[        R                  " U5        O[;        UR*                  R,                  5      S:X  a/  [        R<                  " [        S5      SUR                  0-  5        O.[        R                  " [        S5      SUR                  0-  5        U =R>                  S-  sl        g! [.        R6                   a     GNf = f)zK
:param process: the process to reincarnate
:type process: Process or None
z0reincarnated monitor %(name)s after sudden deathr<   z/reincarnated pusher %(name)s after sudden deathPROMETHEUS_MULTIPROC_DIRprometheus_multiproc_dirr    r9      r   
processing   zNreincarnated worker %(name)s after timeout while processing task %(task_name)s)r<   	task_namez*reincarnated worker %(name)s after timeoutzrecycled worker %(name)sz(reincarnated worker %(name)s after death   N) r   SYNCr	   connections	close_allr   r   r   criticalrC   r<   r   r   osgetenvr   mark_process_deadr&   r}   remover   r   valuer   r   splitr   NoSuchProcess	terminaterk   rB   rx   )r2   processprometheus_pathr   process_namename_splitsmsgs          r3   reincarnateSentinel.reincarnate   sX    yyNN$$&ll"--/DLOODE7<<() #++-DKOOCD7<<() !ii*BII6P,QO '&?'99'++FIIW%}}""a' 	6	'-~~gkk'B'G'G'I&2&8&8&=  #;/14Q<9W (N!# " !!#h!(IFGC HIM C $W]](()R/A89VW\\<RRS@Aw||,-
 	q ) "// s   AK$ $K<;K<c                     / U l         [        U 5      R                  5         [        R                  (       d  [
        R                  R                  5         [        U R                  5       H  nU R                  5         M     U R                  5       U l        U R                  5       U l        [        (       aU  [        R                   (       a?  [#        [        R                   U R                    Vs/ s H  o"R$                  PM     sn5        g g g s  snf r"   )r}   r   saver   r   r	   r   r   ranger|   r   r   r   r   r   r   CPU_AFFINITYset_cpu_affinityr&   )r2   __ws      r3   r   Sentinel.spawn_cluster  s    	T
yyNN$$&'B ( ))+'')6d''T..		0J	1	0JK (60Js   ,D
c                    [         R                  " [        S5      [        5       R                  [        U R                  R                  5      SU R                  5        S3-   S.-  5        U R                  R                  5         [        U 5      R                  5         [         R                  " [        S5      S[        U R                  R                  5      SU R                  5        S3-   0-  5        Sn[        R                  nU R                  R!                  5       (       a  U(       Gd  U R"                   H  nUR$                  R'                  5          UR)                  5       (       a  UR$                  R*                  S:X  a  U R-                  U5         S S S 5        Mi  UR$                  R*                  S:  a  UR$                  =R*                  U-  sl        S S S 5        M     U R.                  R)                  5       (       d  U R-                  U R.                  5        U R0                  R)                  5       (       d  U R-                  U R0                  5        X-  nUS:  a*  [        R2                  (       a  Sn[5        U R6                  S	9  [        U 5      R                  5         [9        U5        U R                  R!                  5       (       d  GM  U(       d  GM  U R;                  5         g ! , (       d  f       GM  = f)
Nz*%(name)s guarding cluster %(cluster_name)sz [])r<   cluster_namez#Q Cluster %(cluster_name)s running.r   r      )r    )r   rB   rC   r   r<   r   r)   r@   r   r%   rI   r   r   r   GUARD_CYCLEr$   rD   r}   r   get_lockrH   r   r   r   r   	SCHEDULERr   r    r   rK   )r2   countercycler   s       r3   r   Sentinel.guard'  s   :;').. ()<)< =t()+!,	
 	T
34)<)< =t()+!,	
   //((**'YYWW%%'::<<177==A+=((+ 	 (' ww}}q(. ('  <<((**  .;;''))  -G"}-JOO%L1 //((**''2 			- ('s   AK/!9K//
K?	c                 :   [        U 5      R                  5         [        5       R                  n[        R
                  " [        S5      SU0-  5        U R                  R                  5         U R                  R                  5       (       aE  [        S5        [        U 5      R                  5         U R                  R                  5       (       a  ME  [        [        U R                  5      5       H  nU R                  R!                  S5        M      U R                  R#                  5         U R                  R%                  5         [        U R                  5      (       a  U R                   H5  nUR                  5       (       a  M  U R                  R'                  U5        M7     [        S5        [        U 5      R                  5         [        U R                  5      (       a  M  U R(                  R!                  S5        U R(                  R#                  5         U R(                  R%                  5         [        R
                  " [        S5      SU0-  5        SnU R*                  (       d  SU l        U R-                  5       [.        R0                  :X  aq  X@R*                  S-  :  a_  [        S5        [        U 5      R                  5         US	-  nU R-                  5       [.        R0                  :X  a  X@R*                  S-  :  a  M_  [        U 5      R                  5         g )
Nz#%(name)s stopping cluster processesr<   r>   STOPz!%(name)s waiting for the monitor.r   r   
   r   )r   r   r   r<   r   rB   rC   r   rI   r   rH   r   r   r   r}   r   putclosejoin_threadr   r   r-   r   r   r   )r2   r<   r   r   counts        r3   rK   Sentinel.stopW  s   T
 %%A;<~MNkk""$$#JJOO kk""$$ DII'BOO' (##%$))nnYYzz||II$$Q'  #JJOO $))nn 	f%!%%'A9:fd^KL||DLkkmt}},9J1J#JJOOQJE kkmt}},9J1J
 	T
r6   )r    r)   r   r   r<   rw   r&   r}   r|   r   rx   r   r%   r$   r   r-   rz   )NNT)rg   rh   ri   rj   r4   r   rA   rn   r   r   r   r   r   r   r   r   r   rK   ro   rp   r6   r3   r?   r?      sn      D=

  
 g Xg X

Kw K@!DL .`&r6   r?   nprocess_idsactualc                    [         (       d   [        R                  " [        S5      5        gU(       aI  [	        [         R
                  " US   5      S5      (       d!  [        R                  " [        S5      5        Sn[        [        [         R                  " 5       5      5      nU (       a  U [        U5      :  a  gSnU H  n/ n[        U 5       H,  nU[        U5      :X  a  SnUR                  X4   5        US-  nM.     [         R                  " U5      (       d  M]  [         R
                  " U5      nU(       a  UR                  U5        [        R                  " [        S5      XVS	.-  5        M     g)
z
Sets the cpu affinity for the supplied processes.
Requires the optional psutil module.
:param int n: affinity
:param list process_ids: a list of pids
:param bool actual: Test workaround for Travis not supporting cpu affinity
z3Skipping cpu affinity because psutil was not found.Nr   cpu_affinityz@Faking cpu affinity because it is not supported on this platformFr   z!%(pid)s will use cpu %(affinity)s)r&   affinity)r   r   warningrC   hasattrr   listr   	cpu_countr   r   
pid_existsr   rB   )	r   r   r   cpu_listindexr&   r   kr   s	            r3   r   r     s    6qNOPgfnn[^<nMMPQ	
 E&**,-.HS]"EqAH%OOHO,QJE	 
 S!!s#Ax(KK5645 r6   )9r   r.   r*   r'   multiprocessingr   r   r   r   timer   djangor   r	   django.apps.registryr
   check_apps_ready
exceptionsAppRegistryNotReadysetupdjango.utilsr   django.utils.translationr   rC   django_q.brokersr   r   django_q.confr   r   r   r   r   r   django_q.humanhashr   django_q.monitorr   django_q.pusherr   django_q.queuesr   django_q.schedulerr   django_q.statusr   r   django_q.workerr   r   r?   TESTINGrk   r   rl   r   rp   r6   r3   <module>r     s    	    B B   % " 6 0  ( $ " ! ( ( "XV XVvx xv DH<<?O ' '$ ' 'c ** 
LLNs   C /C76C7