
    h<                     H   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jD                  eddd      ejF                  ed                      Z$y)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                  x    t        j                  t               j                  t         j                               y N)sysexitr   execute_from_commandlineargv     L/var/www/Befach/backend/env/lib/python3.12/site-packages/celery/bin/multi.pymainr      s    HHY[11#((;<r   c                 .     t                fd       }|S )Nc                 <    | j                           | g|i |S r   )splash)selfargskwargsfuns      r   _innerzsplash.<locals>._inner   s!    4)$)&))r   r   r"   r#   s   ` r   r   r      s     
3Z* * Mr   c                 .     t                fd       }|S )Nc                 6     | | j                  |      fi |S r   )cluster_from_argv)r   r   r!   r"   s      r   r#   zusing_cluster.<locals>._inner   s     4//5@@@r   r   r$   s   ` r   using_clusterr(      s     
3ZA AMr   c                 .     t                fd       }|S )Nc                 d    | j                  |      \  }}| j                  |      } | ||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   s;    ,,T2
7%%a(4#000r   r   r$   s   ` r   using_cluster_and_sigr0      s     
3Z1 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y)
TermLoggerzcelery multi v{version}versionr   c                     |xs t         j                  | _        |xs t         j                  | _        || _        || _        || _        || _        y 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   Nc                 6    | j                  |||       t        S )N)newlinefile)sayr   r   mr=   r>   s       r   okzTermLogger.ok   s    G$/r   c                 P    t        ||xs | j                  |rd       y d       y )N
 )r>   end)printr5   r@   s       r   r?   zTermLogger.say   s    ad)dkkwtGBGr   c                 D    | j                  |||xs | j                        S r   )r?   r6   r@   s       r   carpzTermLogger.carp   s    xx7D$7DKK88r   c                 T    |r| j                  |       | j                          t        S r   )rI   usager   )r   msgs     r   errorzTermLogger.error   s    IIcN

r   c                 D    | j                   r| j                  ||       y y Nr=   )r9   noter   rL   r=   s      r   infozTermLogger.info   s    <<IIc7I+ r   c                 V    | j                   s| j                  t        |      |       y y rO   )r8   r?   strrR   s      r   rQ   zTermLogger.note   s"    zzHHSXwH/ r   c                 b    | j                  t        j                  | j                               y )N)	prog_name)r?   USAGEformatrW   r   s    r   rK   zTermLogger.usage   s    78r   c           	          | j                   sO| j                  | j                  j                   | j                  j
                  di | j                               y y )Nr   )r7   rQ   coloredcyansplash_textrY   splash_contextrZ   s    r   r   zTermLogger.splash   sL    }}IIdll'''  ''>$*=*=>@ A r   c                 D    t        j                  | j                         S )N)enabled)r   r\   r:   rZ   s    r   r\   zTermLogger.colored   s    ||$5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      ss    +K0N G =B %!H9,0 9 9A
 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j8                  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)        Z4y),r   zThe ``celery multi`` program.))z
--nosplashr7   )z--quietr8   )z-qr8   )z	--verboser9   )z
--no-colorr:   Nc                    || _         || _         | j                  |xs ||fi | | j                  | _        d| _        | j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  d| _        y )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;++'ZZIIII==||IIZZkk88II
r   c                 &   | j                  |      }||n| j                  | _        t        j                  j	                  |j                  d            | _        | j                  |      s| j                         S | j                  |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  sx    ,,T2/3txx))$((1+6&&t,::<  a$qr(33r   c                      |xr |d   d   dk7  S )Nr   -r   r   r   s     r   r   zMultiTool.validate_arguments  s    )Q
c))r   c                 ~    	  | j                   |   | xs t        S # t        $ r | j                  d|       cY S w xY w)NzInvalid command: )rv   r   KeyErrorrM   )r   commandr   s      r   r   zMultiTool.call_command  sH    	=)4==)409E9 	=:: 1';<<	=s    <<c                     t        |      }| j                  D ]>  \  }}||v st        | |t        |j	                  |j                  |                         @ |S r   )listreserved_optionssetattrboolr~   index)r   r   argattrs       r   rz   z"MultiTool._handle_reserved_options  sO    Dz..ICd{dD$**S/)B$CD / r   c                 h    | j                  d       t        t        |j                                     S )Nz> Starting nodes...)rQ   intanyrh   r   r.   s     r   rh   zMultiTool.start!  s'     			'(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2C2622r   c           	      N    t        t         |j                  dd|i|            S r   )r   r   rm   r   s       r   rm   zMultiTool.restart2  s'     3w939&9:;;r   c                 R    | j                  dj                  d |D                     y )NrD   c              3   4   K   | ]  }|j                     y wr   )name).0ns     r   	<genexpr>z"MultiTool.names.<locals>.<genexpr>9  s     3a1663s   )r?   joinr   s     r   ro   zMultiTool.names7  s    37334r   c                     	 | j                  |      j                  |      }| j                  dj                  |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;  sW    	0))$/44V<D 77388DII.//  		s    A AAc                 P    | j                  dj                  d |D                    S )NrD   c              3   R   K   | ]  }d j                  |j                         ! yw)r   N)r   argv_with_executabler   r   s     r   r   z!MultiTool.show.<locals>.<genexpr>E  s'      !
 HHT../!
s   %')rB   r   r   s     r   ri   zMultiTool.showC  s+    wwtyy !
!
 
  	r   c                 "    |j                         S r   )rn   r   s     r   rn   zMultiTool.killJ  s     ||~r   c                 t    | j                  dj                  fd| j                  |      D                    S )NrD   c              3   @   K   | ]  }|j                          y wr   )expander)r   r   templates     r   r   z#MultiTool.expand.<locals>.<genexpr>P  s"      !
 MM(#!
s   )rB   r   r'   )r   r   r   s    ` r   rp   zMultiTool.expandO  s7    wwtyy !
..t4!
 
  	r   c                 .    | j                  t               y r   )r?   __doc__r   s     r   rr   zMultiTool.helpU  s    r   c                 F   |j                   t        |j                        d  }t        |      D ]L  }t        |      dk(  r|d   dk(  r	 t	        |d         c S |d   dk(  s3	 t        j                  |dd        c S  |S # t
        $ r Y 2w xY w# t        t        f$ r Y qw xY w)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    vvc!((mn%D>C3x1}Q3s1v;& 1v}">>#ab'22 "  " 
 '	2 s$   A?"B?	B
BB B c                     ||n| j                   }| j                  |      }|j                          || j                  |      j                  |      fS N)rt   )rt   OptionParserparser   )r   r   rt   r-   s       r   _nodes_from_argvzMultiTool._nodes_from_argvg  sN    _c$((d#		$""s"+11!444r   c                 2    | j                  ||      \  }}|S r   )r+   )r   r   rt   _r.   s        r   r'   zMultiTool.cluster_from_argvm  s     ,,Ts,;
7r   c                 j    | j                  ||      \  }}|| j                  t        |      |      fS r   )r   r   r   )r   r   rt   r-   nodess        r   r+   zMultiTool._cluster_from_argvq  s7    ((3(75$,,tE{,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                 X    | j                  | j                  j                  d             y )Nz> Stopping nodes...)rQ   r\   bluer   r   s     r   r   zMultiTool.on_stopping_preamble  s    		$,,##$9:;r   c                 F    | j                  dj                  ||             y )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Cr   c                     t        |      }|r^| j                  | j                  j                  dj	                  |t        |d      dj                  d |D                          d       y y )Nz> Waiting for {} {} -> {}...r   z, c              3   F   K   | ]  }t        |j                          y wr   )rU   pidr   s     r   r   z1MultiTool.on_still_waiting_for.<locals>.<genexpr>  s     >c$((m>s   !FrP   )r   rQ   r\   r   rY   r   r   )r   r   num_lefts      r   r   zMultiTool.on_still_waiting_for  sg    u:IIdll''.55i&9II>>>@ 	   r   c                 *    | j                  dd       y )N.FrP   rQ   r   s     r   r   z#MultiTool.on_still_waiting_progress  s    		#u	%r   c                 &    | j                  d       y )NrE   r   rZ   s    r   r   zMultiTool.on_still_waiting_end  s    		"r   c                 D    | j                  dj                  |             y )Nz4Could not signal {0.name} ({0.pid}): No such processr   r   r   s     r   r   zMultiTool.on_node_signal_dead  s    		BII	r   c                 F    | j                  d|j                   dd       y )Nz	> : FrP   )rQ   r   r   s     r   r   zMultiTool.on_node_start  s    		D2&	6r   c                 x    | j                  | j                  j                  d|j                   d      d       y )Nz> Restarting node r   FrP   )rQ   r\   r   r   r   s     r   r   zMultiTool.on_node_restart  s8    		$,,## 2.09> 	 	@r   c                 Z    | j                  d|j                   d| j                          y )Nz> r   )rQ   r   DOWNr   s     r   r   zMultiTool.on_node_down  s#    		BtyykDII;/0r   c                 Z    | j                  d|j                   d| j                          y )Nz
	> r   )rQ   r   OKr   s     r   r   zMultiTool.on_node_shutdown_ok  s#    		F499+Ry12r   c                 ^    | j                  |xr | j                  xs | j                         y r   )rQ   FAILEDr   )r   r   retvals      r   r   zMultiTool.on_node_status  s     		&(T[[3DGG4r   c                 H    | j                  dj                  ||             y )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                 ,    | j                  d|        y )Nz  )rS   )r   r   argstrrs   s       r   r   zMultiTool.on_child_spawn  s    		Bvh- r   c                 ,    | j                  d|        y )Nz!* Child was terminated by signal r   )r   r   r   s      r   r   zMultiTool.on_child_signalled  s    		5fX>?r   c                 ,    | j                  d|        y )Nz"* Child terminated with exit code r   )r   r   re   s      r   r   zMultiTool.on_child_failure  s    		6wi@Ar   c                 J    t        | j                  j                  d            S )Nr   )rU   r\   greenrZ   s    r   r   zMultiTool.OK  s    4<<%%d+,,r   c                 J    t        | j                  j                  d            S )Nr   )rU   r\   redrZ   s    r   r   zMultiTool.FAILED  s    4<<##H-..r   c                 J    t        | j                  j                  d            S )Nr   )rU   r\   magentarZ   s    r   r   zMultiTool.DOWN  s    4<<''/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*= )  ) /  / 3  3K<  < 5 50      -3NN 55
,<D&
7@135!@B - - / / 1 1r   r   T)allow_extra_argsignore_unknown_options)clscontext_settingsc                    t        | j                  j                  | j                  j                        }t        j
                  dd }||j                  d      d |d|j                  d       z   }|j                  |      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     sp     #''--#''2B2B
CC 88AB<D

7#$%-Adjj.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H 
  
   / ! J J A 7 7  '
	*=57 57pj1
 j1Z  "& .  .r   