o
    Df<                     @   s  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d Zdd Zdd Zdd ZG dd dZ G dd de Z!ej"eddddej#ed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                   C   s   t t t j d S N)sysexitr   execute_from_commandlineargv r   r   I/home/ubuntu/webapp/venv/lib/python3.10/site-packages/celery/bin/multi.pymain   s   r   c                       t   fdd}|S )Nc                    s   |     | g|R i |S r   )splash)selfargskwargsfunr   r   _inner   s   zsplash.<locals>._innerr   r   r    r   r   r   r      s   r   c                    r   )Nc                    s    | |  |fi |S r   )cluster_from_argv)r   r   r   r   r   r   r          zusing_cluster.<locals>._innerr   r!   r   r   r   using_cluster   s   r$   c                    r   )Nc                    s,   |  |\}}| |} | ||fi |S r   )_cluster_from_argv_find_sig_argument)r   r   r   pclustersigr   r   r   r       s   
z%using_cluster_and_sig.<locals>._innerr   r!   r   r   r   using_cluster_and_sig   s   r*   c                   @   s   e Zd ZdZdeiZdZ		dddZdd	d
ZdddZ	dddZ
dddZdddZdddZedd Zdd Zedd ZdS )
TermLoggerzcelery multi v{version}versionr   Fc                 K   s4   |pt j| _|p
t j| _|| _|| _|| _|| _d S r   )r   stdoutstderrnosplashquietverboseno_color)r   r-   r.   r/   r0   r1   r2   r   r   r   r   setup_terminal   s   
zTermLogger.setup_terminalTNc                 C   s   | j |||d tS )N)newlinefile)sayr   r   mr4   r5   r   r   r   ok   s   zTermLogger.okc                 C   s    t ||p| j|r
dndd d S )N
 )r5   end)printr-   r7   r   r   r   r6      s    zTermLogger.sayc                 C   s   |  |||p| jS r   )r6   r.   r7   r   r   r   carp      zTermLogger.carpc                 C   s   |r|  | |   tS r   )r>   usager   )r   msgr   r   r   error   s   
zTermLogger.errorc                 C   s   | j r| j||d d S d S Nr4   )r1   noter   rA   r4   r   r   r   info   s   zTermLogger.infoc                 C   s    | j s| jt||d d S d S rC   )r0   r6   strrF   r   r   r   rE      s   zTermLogger.notec                 C   s   |  tj| jd d S )N)	prog_name)r6   USAGEformatrI   r   r   r   r   r@      r#   zTermLogger.usagec                 C   s0   | j s| | j| jjdi | j d S d S )Nr   )r/   rE   coloredcyansplash_textrK   splash_contextrL   r   r   r   r      s
   

zTermLogger.splashc                 C   s   t j| j dS )N)enabled)r   rM   r2   rL   r   r   r   rM         zTermLogger.colored)FFFF)TNr   )T)__name__
__module____qualname__rO   r   rP   retcoder3   r9   r6   r>   rB   rG   rE   r   r@   r   rM   r   r   r   r   r+      s$    








r+   c                   @   s  e Zd ZdZeZeZg dZ		dPddZdQddZ	dd	 Z
d
d Zdd Zeedd Zeedd Zeedd ZeZeedd Zedd Zdd Zedd Zeedd Zdd Zd d! Zejfd"d#ZdQd$d%ZdQd&d'ZdQd(d)Z dQd*d+Z!d,d- Z"d.d/ Z#d0d1 Z$d2d3 Z%d4d5 Z&d6d7 Z'd8d9 Z(d:d; Z)d<d= Z*d>d? Z+d@dA Z,dBdC Z-dDdE Z.dFdG Z/dHdI Z0e1dJdK Z2e1dLdM Z3e1dNdO Z4dS )Rr   zThe ``celery multi`` program.))z
--nosplashr/   )z--quietr0   )z-qr0   )z	--verboser1   )z
--no-colorr2   Nc                 K   sj   || _ || _| 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cmdr3   r-   fhrI   rW   rX   rY   rZ   r\   r]   r^   r_   r`   ra   commands)r   rb   rc   rd   r-   r.   r   r   r   r   __init__   s"   zMultiTool.__init__c                 C   s\   |  |}|d ur|n| j| _tj|d| _| |s"|  S | 	|d |dd  S )Nr      )
_handle_reserved_optionsrc   ospathbasenamepoprI   validate_argumentsrB   call_command)r   r   rc   r   r   r   r     s   

z"MultiTool.execute_from_commandlinec                 C   s   |o	|d d dkS )Nr   -r   r   r   r   r   r   rm     r?   zMultiTool.validate_argumentsc                 C   s8   z
| j | | p	tW S  ty   | d|  Y S w )NzInvalid command: )re   r   KeyErrorrB   )r   commandr   r   r   r   rn     s
   zMultiTool.call_commandc              
   C   s@   t |}| jD ]\}}||v rt| |t||| q|S r   )listreserved_optionssetattrboolrl   index)r   r   argattrr   r   r   rh     s   z"MultiTool._handle_reserved_optionsc                 C   s   |  d tt| S )Nz> Starting nodes...)rE   intanyrW   r   r(   r   r   r   rW   !  s   
zMultiTool.startc                 K      |j dd|i|S Nr)   r   )rY   r   r(   r)   r   r   r   r   rY   '     zMultiTool.stopc                 K   r}   r~   )rZ   r   r   r   r   rZ   ,  r   zMultiTool.stopwaitc                 K   s   t t|jdd|i|S r~   )rz   r{   r\   r   r   r   r   r\   2  s   zMultiTool.restartc                 C   s   |  ddd |D  d S )Nr:   c                 s   s    | ]}|j V  qd S r   )name).0nr   r   r   	<genexpr>9  s    z"MultiTool.names.<locals>.<genexpr>)r6   joinr|   r   r   r   r^   7  s   zMultiTool.namesc                 G   s>   z
|  ||}W n ty   t Y S w | d|jS )N )r"   findrq   r   r9   r   r   )r   wantedr   noder   r   r   r`   ;  s   zMultiTool.getc                 C   s   |  ddd |D S )Nr:   c                 s   s    | ]	}d  |jV  qdS )r   N)r   argv_with_executabler   r   r   r   r   r   E  s
    

z!MultiTool.show.<locals>.<genexpr>)r9   r   r|   r   r   r   rX   C  s   
zMultiTool.showc                 C   s   |  S r   )r]   r|   r   r   r   r]   J  s   zMultiTool.killc                    s$   |  d fdd| |D S )Nr:   c                 3   s    | ]}|  V  qd S r   )expanderr   templater   r   r   P  s
    
z#MultiTool.expand.<locals>.<genexpr>)r9   r   r"   )r   r   r   r   r   r   r_   O  s   
zMultiTool.expandc                 G   s   |  t d S r   )r6   __doc__rp   r   r   r   ra   U     zMultiTool.helpc              
   C   s   |j t|jd  }t|D ]?}t|dkr/|d dkr/z	t|d W   S  ty.   Y nw |d dkrMzt|dd  W   S  tt	fyL   Y qw q|S )N   r   ro   rg   )
r   lenvaluesreversedrz   
ValueErrorr   signumAttributeError	TypeError)r   r'   defaultr   rx   r   r   r   r&   X  s    zMultiTool._find_sig_argumentc                 C   s:   |d ur|n| j }| |}|  || j|d|fS N)rc   )rc   OptionParserparser   )r   r   rc   r'   r   r   r   _nodes_from_argvg  s   
zMultiTool._nodes_from_argvc                 C   s   | j ||d\}}|S r   )r%   )r   r   rc   _r(   r   r   r   r"   m  s   zMultiTool.cluster_from_argvc                 C   s(   | j ||d\}}|| jt||dfS r   )r   r   rs   )r   r   rc   r'   nodesr   r   r   r%   q  s   zMultiTool._cluster_from_argvc                 C   s   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 )Nrc   rb   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   rb   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   rc   r   r   r   r   u  sJ   	
zMultiTool.Clusterc                 C   s   |  | jd d S )Nz> Stopping nodes...)rE   rM   bluer   r   r   r   r   r        zMultiTool.on_stopping_preamblec                 C   s   |  d|| d S )Nz	> {0.name}: {1} -> {0.pid}rE   rK   r   r   r)   r   r   r   r     r   zMultiTool.on_send_signalc                 C   sJ   t |}|r#| j| jd|t|dddd |D dd d S d S )Nz> Waiting for {} {} -> {}...r   z, c                 s   s    | ]}t |jV  qd S r   )rH   pidr   r   r   r   r     s    z1MultiTool.on_still_waiting_for.<locals>.<genexpr>FrD   )r   rE   rM   r   rK   r   r   )r   r   num_leftr   r   r   r     s   


zMultiTool.on_still_waiting_forc                 C   s   | j ddd d S )N.FrD   rE   r   r   r   r   r     s   z#MultiTool.on_still_waiting_progressc                 C   s   |  d d S )Nr;   r   rL   r   r   r   r     r   zMultiTool.on_still_waiting_endc                 C   s   |  d| d S )Nz4Could not signal {0.name} ({0.pid}): No such processr   r   r   r   r   r   r     s
   zMultiTool.on_node_signal_deadc                 C   s   | j d|j ddd d S )Nz	> : FrD   )rE   r   r   r   r   r   r     s   zMultiTool.on_node_startc                 C   s$   | j | jd|j ddd d S )Nz> Restarting node r   FrD   )rE   rM   r   r   r   r   r   r   r     s
   

zMultiTool.on_node_restartc                 C      |  d|j d| j  d S )Nz> r   )rE   r   DOWNr   r   r   r   r        zMultiTool.on_node_downc                 C   r   )Nz
	> r   )rE   r   OKr   r   r   r   r     r   zMultiTool.on_node_shutdown_okc                 C   s   |  |r| jp	| j d S r   )rE   FAILEDr   )r   r   retvalr   r   r   r     s   zMultiTool.on_node_statusc                 C   s   |  dj||d d S )Nz(Sending {sig} to node {0.name} ({0.pid}))r)   r   r   r   r   r   r     s   zMultiTool.on_node_signalc                 C      |  d|  d S )Nz  )rG   )r   r   argstrrb   r   r   r   r     r?   zMultiTool.on_child_spawnc                 C   r   )Nz!* Child was terminated by signal r   )r   r   r   r   r   r   r     r?   zMultiTool.on_child_signalledc                 C   r   )Nz"* Child terminated with exit code r   )r   r   rV   r   r   r   r     r?   zMultiTool.on_child_failurec                 C      t | jdS )Nr   )rH   rM   greenrL   r   r   r   r     rR   zMultiTool.OKc                 C   r   )Nr   )rH   rM   redrL   r   r   r   r     rR   zMultiTool.FAILEDc                 C   r   )Nr   )rH   rM   magentarL   r   r   r   r     rR   zMultiTool.DOWN)NNNNNr   )5rS   rT   rU   r   r   r   r   rt   rf   r   rm   rn   rh   r   r$   rW   r*   rY   rZ   r[   r\   r^   r`   rX   r]   r_   ra   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      sz    







	

r   T)allow_extra_argsignore_unknown_options)clscontext_settingsc                 K   sP   t | jj| jjd}tjdd }||dd |d|d  }||S )z Start multiple worker instances.)r0   r2   rg   Nmulti)r   objr0   r2   r   r   rw   r   )ctxr   rc   r   r   r   r   r     s   $
r   )%r   ri   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__rJ   r   r   r$   r*   r+   r   rr   pass_contextr   r   r   r   r   <module>   s>    d	
8 n