
    `f<                     Z   d Z ddlZddlZddlZddlmZ ddlZddlmZ ddl	m
Z
 ddlmZmZmZ ddlmZmZ ddlmZmZmZ dd	lmZ dd
lmZ dZdZd Zd Zd Zd Z G d d          Z  G d de           Z! ej"        eddd          ej#        ed                                     Z$dS )a  Start multiple worker instances from the command-line.

.. program:: celery multi

Examples
========

.. code-block:: console

    $ # Single worker with explicit name and events enabled.
    $ celery multi start Leslie -E

    $ # Pidfiles and logfiles are stored in the current directory
    $ # by default.  Use --pidfile and --logfile argument to change
    $ # this.  The abbreviation %n will be expanded to the current
    $ # node name.
    $ celery multi start Leslie -E --pidfile=/var/run/celery/%n.pid
                                   --logfile=/var/log/celery/%n%I.log


    $ # You need to add the same arguments when you restart,
    $ # as these aren't persisted anywhere.
    $ celery multi restart Leslie -E --pidfile=/var/run/celery/%n.pid
                                     --logfile=/var/log/celery/%n%I.log

    $ # To stop the node, you need to specify the same pidfile.
    $ celery multi stop Leslie --pidfile=/var/run/celery/%n.pid

    $ # 3 workers, with 3 processes each
    $ celery multi start 3 -c 3
    celery worker -n celery1@myhost -c 3
    celery worker -n celery2@myhost -c 3
    celery worker -n celery3@myhost -c 3

    $ # override name prefix when using range
    $ celery multi start 3 --range-prefix=worker -c 3
    celery worker -n worker1@myhost -c 3
    celery worker -n worker2@myhost -c 3
    celery worker -n worker3@myhost -c 3

    $ # start 3 named workers
    $ celery multi start image video data -c 3
    celery worker -n image@myhost -c 3
    celery worker -n video@myhost -c 3
    celery worker -n data@myhost -c 3

    $ # specify custom hostname
    $ celery multi start 2 --hostname=worker.example.com -c 3
    celery worker -n celery1@worker.example.com -c 3
    celery worker -n celery2@worker.example.com -c 3

    $ # specify fully qualified nodenames
    $ celery multi start foo@worker.example.com bar@worker.example.com -c 3

    $ # fully qualified nodenames but using the current hostname
    $ celery multi start foo@%h bar@%h

    $ # Advanced example starting 10 workers in the background:
    $ #   * Three of the workers processes the images and video queue
    $ #   * Two of the workers processes the data queue with loglevel DEBUG
    $ #   * the rest processes the default' queue.
    $ celery multi start 10 -l INFO -Q:1-3 images,video -Q:4,5 data
        -Q default -L:4,5 DEBUG

    $ # You can show the commands necessary to start the workers with
    $ # the 'show' command:
    $ celery multi show 10 -l INFO -Q:1-3 images,video -Q:4,5 data
        -Q default -L:4,5 DEBUG

    $ # Additional options are added to each celery worker's command,
    $ # but you can also modify the options for ranges of, or specific workers

    $ # 3 workers: Two with 3 processes, and one with 10 processes.
    $ celery multi start 3 -c 3 -c:1 10
    celery worker -n celery1@myhost -c 10
    celery worker -n celery2@myhost -c 3
    celery worker -n celery3@myhost -c 3

    $ # can also specify options for named workers
    $ celery multi start image video data -c 3 -c:image 10
    celery worker -n image@myhost -c 10
    celery worker -n video@myhost -c 3
    celery worker -n data@myhost -c 3

    $ # ranges and lists of workers in options is also allowed:
    $ # (-c:1-3 can also be written as -c:1,2,3)
    $ celery multi start 5 -c 3  -c:1-3 10
    celery worker -n celery1@myhost -c 10
    celery worker -n celery2@myhost -c 10
    celery worker -n celery3@myhost -c 10
    celery worker -n celery4@myhost -c 3
    celery worker -n celery5@myhost -c 3

    $ # lists also works with named workers
    $ celery multi start foo bar baz xuzzy -c 3 -c:foo,bar,baz 10
    celery worker -n foo@myhost -c 10
    celery worker -n bar@myhost -c 10
    celery worker -n baz@myhost -c 10
    celery worker -n xuzzy@myhost -c 3
    Nwraps)cached_property)VERSION_BANNER)ClusterMultiParserNamespacedOptionParser)CeleryCommandhandle_preload_options)
EX_FAILUREEX_OKsignals)term)	pluralize)	MultiToola  usage: {prog_name} start <node1 node2 nodeN|range> [worker options]
       {prog_name} stop <n1 n2 nN|range> [-SIG (default: -TERM)]
       {prog_name} restart <n1 n2 nN|range> [-SIG] [worker options]
       {prog_name} kill <n1 n2 nN|range>

       {prog_name} show <n1 n2 nN|range> [worker options]
       {prog_name} get hostname <n1 n2 nN|range> [-qv] [worker options]
       {prog_name} names <n1 n2 nN|range>
       {prog_name} expand template <n1 n2 nN|range>
       {prog_name} help

additional options (must appear after command name):

    * --nosplash:   Don't display program info.
    * --quiet:      Don't show as much output.
    * --verbose:    Show more output.
    * --no-color:   Don't display colors.
c                      t          j        t                                          t           j                             d S N)sysexitr   execute_from_commandlineargv     B/var/www/html/env/lib/python3.11/site-packages/celery/bin/multi.pymainr      s,    HY[[11#(;;<<<<<r   c                 <     t                      fd            }|S )Nc                 D    |                                    | g|R i |S r   )splash)selfargskwargsfuns      r   _innerzsplash.<locals>._inner   s0    s4)$)))&)))r   r   r"   r#   s   ` r   r   r      s3    
3ZZ* * * * Z* Mr   c                 <     t                      fd            }|S )Nc                 >     | |                      |          fi |S r   )cluster_from_argv)r   r   r!   r"   s      r   r#   zusing_cluster.<locals>._inner   s+    s4//55@@@@@r   r   r$   s   ` r   using_clusterr(      s6    
3ZZA A A A ZAMr   c                 <     t                      fd            }|S )Nc                 t    |                      |          \  }}|                     |          } | ||fi |S r   )_cluster_from_argv_find_sig_argument)r   r   r!   pclustersigr"   s         r   r#   z%using_cluster_and_sig.<locals>._inner   sI    ,,T22
7%%a((s4#00000r   r   r$   s   ` r   using_cluster_and_sigr0      s3    
3ZZ1 1 1 1 Z1 Mr   c                       e Zd ZdZdeiZdZ	 	 ddZddZdd	Z	dd
Z
ddZddZddZed             Zd Zed             ZdS )
TermLoggerzcelery multi v{version}versionr   Fc                     |pt           j        | _        |pt           j        | _        || _        || _        || _        || _        d S r   )r   stdoutstderrnosplashquietverboseno_color)r   r5   r6   r7   r8   r9   r:   r!   s           r   setup_terminalzTermLogger.setup_terminal   s@     *
*
 
 r   TNc                 @    |                      |||           t          S )N)newlinefile)sayr   r   mr=   r>   s       r   okzTermLogger.ok   s    G$///r   c                 @    t          ||p| j        |rdnd           d S )N
 )r>   end)printr5   r@   s       r   r?   zTermLogger.say   s-    ad)dkw/FttBGGGGGGr   c                 >    |                      |||p| j                  S r   )r?   r6   r@   s       r   carpzTermLogger.carp   s    xx7D$7DK888r   c                 f    |r|                      |           |                                  t          S r   )rI   usager   )r   msgs     r   errorzTermLogger.error   s,     	IIcNNN

r   c                 F    | j         r|                     ||           d S d S Nr=   )r9   noter   rL   r=   s      r   infozTermLogger.info   s2    < 	,IIc7I+++++	, 	,r   c                 `    | j         s&|                     t          |          |           d S d S rO   )r8   r?   strrR   s      r   rQ   zTermLogger.note   s8    z 	0HHSXXwH/////	0 	0r   c                 l    |                      t                              | j                             d S )N)	prog_name)r?   USAGEformatrW   r   s    r   rK   zTermLogger.usage   s*    7788888r   c           	          | j         sD|                     | j                             | j        j        di | j                             d S d S )Nr   )r7   rQ   coloredcyansplash_textrY   splash_contextrZ   s    r   r   zTermLogger.splash   sp    } 	AIIdl''' '>>$*=>>@ @ A A A A A	A 	Ar   c                 8    t          j        | j                   S )N)enabled)r   r\   r:   rZ   s    r   r\   zTermLogger.colored   s    |$56666r   )FFFF)TNr   )T)__name__
__module____qualname__r^   r   r_   retcoder;   rB   r?   rI   rM   rS   rQ   r   rK   r   r\   r   r   r   r2   r2      s       +K0N G =B %! ! ! !   H H H H9 9 9 9   , , , ,0 0 0 0 9 9 V9A A A
 7 7 _7 7 7r   r2   c                      e Zd ZdZeZeZg dZ	 	 d*dZd+dZ	d Z
d Zd Zeed	                         Zeed
                         Zeed                         ZeZeed                         Zed             Zd Zed             Zeed                         Zd Zd Zej        fdZd+dZd+dZd+dZ d+dZ!d Z"d Z#d Z$d Z%d Z&d Z'd Z(d Z)d  Z*d! Z+d" Z,d# Z-d$ Z.d% Z/d& Z0e1d'             Z2e1d(             Z3e1d)             Z4dS ),r   zThe ``celery multi`` program.))z
--nosplashr7   )z--quietr8   )z-qr8   )z	--verboser9   )z
--no-colorr:   Nc                     || _         || _         | j        |p||fi | | j        | _        d| _        | j        | j        | j        | j	        | j	        | j
        | j        | j        | j        | j        | j        d| _        d S )Nzcelery multi)startshowstopstopwaitstop_verifyrestartkillnamesexpandgethelp)envcmdr;   r5   fhrW   rh   ri   rj   rk   rm   rn   ro   rp   rq   rr   commands)r   rs   rt   ru   r5   r6   r!   s          r   __init__zMultiTool.__init__   s     FLb&;;F;;;+'ZII=|IZk8I
 
r   c                 T   |                      |          }||n| j        | _        t          j                            |                    d                    | _        |                     |          s|                                 S | 	                    |d         |dd                    S )Nr      )
_handle_reserved_optionsrt   ospathbasenamepoprW   validate_argumentsrM   call_command)r   r   rt   s      r   r   z"MultiTool.execute_from_commandline  s    ,,T22/33tx))$((1++66&&t,, 	 ::<<  a$qrr(333r   c                 *    |o|d         d         dk    S )Nr   -r   r   r   s     r   r   zMultiTool.validate_arguments  s    )Q
c))r   c                     	  | j         |         | pt          S # t          $ r |                     d|           cY S w xY w)NzInvalid command: )rv   r   KeyErrorrM   )r   commandr   s      r   r   zMultiTool.call_command  s\    	=)4=)409E9 	= 	= 	=::;';;<<<<<	=s    ">>c                     t          |          }| j        D ]M\  }}||v rDt          | |t          |                    |                    |                                         N|S r   )listreserved_optionssetattrboolr~   index)r   r   argattrs       r   rz   z"MultiTool._handle_reserved_options  sd    Dzz. 	E 	EICd{{dD$**S//)B)B$C$CDDDr   c                     |                      d           t          t          |                                                    S )Nz> Starting nodes...)rQ   intanyrh   r   r.   s     r   rh   zMultiTool.start!  s5     			'(((3w}}''(((r   c                       |j         dd|i|S Nr/   r   )rj   r   r.   r/   r!   s       r   rj   zMultiTool.stop'  s!     w|...v...r   c                       |j         dd|i|S r   )rk   r   s       r   rk   zMultiTool.stopwait,  s"      w22C26222r   c           	      T    t          t           |j        dd|i|                    S r   )r   r   rm   r   s       r   rm   zMultiTool.restart2  s1     3w9939&99::;;;r   c                 j    |                      d                    d |D                                  d S )NrD   c              3   $   K   | ]}|j         V  d S r   )name).0ns     r   	<genexpr>z"MultiTool.names.<locals>.<genexpr>9  s$      33a16333333r   )r?   joinr   s     r   ro   zMultiTool.names7  s5    3373333344444r   c                     	 |                      |                              |          }|                     d                    |j                            S # t
          $ r
 t          cY S w xY w)N )r'   findrB   r   r   r   r   )r   wantedr   nodes       r   rq   zMultiTool.get;  ss    	0))$//44V<<D 77388DI..///  	 	 		s   (A A+*A+c                 f    |                      d                    d |D                                 S )NrD   c              3   J   K   | ]}d                      |j                  V  dS )r   N)r   argv_with_executabler   r   s     r   r   z!MultiTool.show.<locals>.<genexpr>E  sE       !
 !
 HHT.//!
 !
 !
 !
 !
 !
r   )rB   r   r   s     r   ri   zMultiTool.showC  sD    wwtyy !
 !
!
 !
 !
 
 
   	r   c                 *    |                                 S r   )rn   r   s     r   rn   zMultiTool.killJ  s     ||~~r   c                     |                      d                    fd|                     |          D                                 S )NrD   c              3   B   K   | ]}|                               V  d S r   )expander)r   r   templates     r   r   z#MultiTool.expand.<locals>.<genexpr>P  sC       !
 !
 MM(##!
 !
 !
 !
 !
 !
r   )rB   r   r'   )r   r   r   s    ` r   rp   zMultiTool.expandO  s]    wwtyy !
 !
 !
 !
..t44!
 !
 !
 
 
   	r   c                 :    |                      t                     d S r   )r?   __doc__r   s     r   rr   zMultiTool.helpU  s    r   c                 ~   |j         t          |j                  d          }t          |          D ]}t          |          dk    r4|d         dk    r(	 t	          |d                   c S # t
          $ r Y nw xY w|d         dk    r6	 t          j        |dd                    c S # t          t          f$ r Y w xY w|S )N   r   r   ry   )
r    lenvaluesreversedr   
ValueErrorr   signumAttributeError	TypeError)r   r-   defaultr    r   s        r   r,   zMultiTool._find_sig_argumentX  s    vc!(mmnn%D>> 
	 
	C3xx1}}Q3s1v;;&&&!   D1v}}">#abb'22222&	2   D 
 s$   A**
A76A7B%%B98B9c                     ||n| j         }|                     |          }|                                 ||                     |                              |          fS N)rt   )rt   OptionParserparser   )r   r   rt   r-   s       r   _nodes_from_argvzMultiTool._nodes_from_argvg  s[    _cc$(d##				$""s"++11!4444r   c                 :    |                      ||          \  }}|S r   )r+   )r   r   rt   _r.   s        r   r'   zMultiTool.cluster_from_argvm  s#    ,,Ts,;;
7r   c                     |                      ||          \  }}||                     t          |          |          fS r   )r   r   r   )r   r   rt   r-   nodess        r   r+   zMultiTool._cluster_from_argvq  s?    ((3(775$,,tE{{,4444r   c                    t          |fi d|d| j        d| j        d| j        d| j        d| j        d| j        d| j        d	| j        d
| j	        d| j
        d| j        d| j        d| j        d| j        d| j        d| j        S )Nrt   rs   on_stopping_preambleon_send_signalon_still_waiting_foron_still_waiting_progresson_still_waiting_endon_node_starton_node_restarton_node_shutdown_okon_node_statuson_node_signal_deadon_node_signalon_node_downon_child_spawnon_child_signalledon_child_failure)r   rs   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   rt   s      r   r   zMultiTool.Clusteru  s$   
 
 

 
 "&!:!:	

  ..
 "&!:!:
 '+&D&D
 "&!:!:
 ,,
 !00
 !% 8 8
  ..
 !% 8 8
  ..
 **
   ..!
"  $66#
$ "22%
 	
r   c                 `    |                      | j                            d                     d S )Nz> Stopping nodes...)rQ   r\   bluer   r   s     r   r   zMultiTool.on_stopping_preamble  s+    		$,##$9::;;;;;r   c                 X    |                      d                    ||                     d S )Nz	> {0.name}: {1} -> {0.pid}rQ   rY   r   r   r/   s      r   r   zMultiTool.on_send_signal  s+    		077cBBCCCCCr   c                 
   t          |          }|rq|                     | j                            d                    |t          |d          d                    d |D                                           d           d S d S )Nz> Waiting for {} {} -> {}...r   z, c              3   >   K   | ]}t          |j                  V  d S r   )rU   pidr   s     r   r   z1MultiTool.on_still_waiting_for.<locals>.<genexpr>  s*      >>c$(mm>>>>>>r   FrP   )r   rQ   r\   r   rY   r   r   )r   r   num_lefts      r   r   zMultiTool.on_still_waiting_for  s    u:: 	IIdl''.55i&99II>>>>>>>@ @  	      	 	r   c                 4    |                      dd           d S )N.FrP   rQ   r   s     r   r   z#MultiTool.on_still_waiting_progress  s    		#u	%%%%%r   c                 0    |                      d           d S )NrE   r   rZ   s    r   r   zMultiTool.on_still_waiting_end  s    		"r   c                 V    |                      d                    |                     d S )Nz4Could not signal {0.name} ({0.pid}): No such processr   r   r   s     r   r   zMultiTool.on_node_signal_dead  s8    		BII 	 	 	 	 	r   c                 F    |                      d|j         dd           d S )Nz	> : FrP   )rQ   r   r   s     r   r   zMultiTool.on_node_start  s,    		&&&&	66666r   c                 v    |                      | j                            d|j         d          d           d S )Nz> Restarting node r   FrP   )rQ   r\   r   r   r   s     r   r   zMultiTool.on_node_restart  sS    		$,##....0 09> 	 	@ 	@ 	@ 	@ 	@r   c                 P    |                      d|j         d| j                    d S )Nz> r   )rQ   r   DOWNr   s     r   r   zMultiTool.on_node_down  s/    		/ty//DI//00000r   c                 P    |                      d|j         d| j                    d S )Nz
	> r   )rQ   r   OKr   s     r   r   zMultiTool.on_node_shutdown_ok  s/    		149111122222r   c                 L    |                      |r| j        p| j                   d S r   )rQ   FAILEDr   )r   r   retvals      r   r   zMultiTool.on_node_status  s(    		&(T[3DG44444r   c                 Z    |                      d                    ||                     d S )Nz(Sending {sig} to node {0.name} ({0.pid}))r/   r   r   s      r   r   zMultiTool.on_node_signal  s@    		<CCc D   	 	 	 	 	r   c                 6    |                      d|            d S )Nz  )rS   )r   r   argstrrs   s       r   r   zMultiTool.on_child_spawn  s     		-v--     r   c                 6    |                      d|            d S )Nz!* Child was terminated by signal r   )r   r   r   s      r   r   zMultiTool.on_child_signalled  s#    		>f>>?????r   c                 6    |                      d|            d S )Nz"* Child terminated with exit code r   )r   r   re   s      r   r   zMultiTool.on_child_failure  s#    		@w@@AAAAAr   c                 P    t          | j                            d                    S )Nr   )rU   r\   greenrZ   s    r   r   zMultiTool.OK  s     4<%%d++,,,r   c                 P    t          | j                            d                    S )Nr   )rU   r\   redrZ   s    r   r   zMultiTool.FAILED  s     4<##H--...r   c                 P    t          | j                            d                    S )Nr   )rU   r\   magentarZ   s    r   r   zMultiTool.DOWN  s     4<''//000r   )NNNNNr   )5rb   rc   rd   r   r   r	   r   r   rw   r   r   r   rz   r   r(   rh   r0   rj   rk   rl   rm   ro   rq   ri   rn   rp   rr   signalSIGTERMr,   r   r'   r+   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      s^       ''K)L   &*.2
 
 
 
,	4 	4 	4 	4* * *= = =   ) ) ] V) / /  V/ 3 3  V3K< <  V< 5 5 ]50 0 0   ]   ] V     -3N    5 5 5 5   5 5 5 5
 
 
 
,< < <D D D  & & &    
7 7 7@ @ @1 1 13 3 35 5 5  ! ! !@ @ @B B B - - _- / / _/ 1 1 _1 1 1r   r   T)allow_extra_argsignore_unknown_options)clscontext_settingsc                    t          | j        j        | j        j                  }t          j        dd         }||                    d          d         |d|                    d                   z   }|                    |          S )z Start multiple worker instances.)r8   r:   ry   Nmulti)r   objr8   r:   r   r   r   r   )ctxr!   rt   r    s       r   r   r     s|     #'-#'2B
C
C
CC 8ABB<D

7##$$%-Adjj.A.A-A(BBD''---r   )%r   r{   r   r   	functoolsr   clickkombu.utils.objectsr   celeryr   celery.apps.multir   r   r	   celery.bin.baser
   r   celery.platformsr   r   r   celery.utilsr   celery.utils.textr   __all__rX   r   r   r(   r0   r2   r   r   pass_contextr   r   r   r   <module>r     s  c cH 
			  



        / / / / / / ! ! ! ! ! ! J J J J J J J J J J A A A A A A A A 7 7 7 7 7 7 7 7 7 7       ' ' ' ' ' '
	*= = =      57 57 57 57 57 57 57 57pj1 j1 j1 j1 j1
 j1 j1 j1Z  "&    . .   . . .r   