o
    wvXjQ9  ã                   @   sò   d Z ddlmZmZmZ ddlZddlZddlZddlm	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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e ƒZ!G dd„ de!ƒZ"e#dkrweƒ  dS 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

    $ # 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' 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
é    )Úabsolute_importÚprint_functionÚunicode_literalsN©Úwraps)Úcached_property)ÚVERSION_BANNER)ÚClusterÚMultiParserÚNamespacedOptionParser)Ú
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   úM/var/www/html/myproject/venv/lib/python3.10/site-packages/celery/bin/multi.pyÚmain†   ó   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/   r0   r1   r2   r3   r4   r   r   r   r   Úsetup_terminal­   s   
zTermLogger.setup_terminalTNc                 C   s   | j |||d� tS )N)ÚnewlineÚfile)Úsayr   ©r   Úmr6   r7   r   r   r   Úok·   s   zTermLogger.okc                 C   s    t ||p| j|r
dndd� d S )NÚ
Ú )r7   Úend)Úprintr/   r9   r   r   r   r8   »   s    zTermLogger.sayc                 C   s   |   |||p| j¡S r   )r8   r0   r9   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©r6   )r3   Únote©r   rC   r6   r   r   r   ÚinfoÇ   s   ÿzTermLogger.infoc                 C   s    | j s| jt|ƒ|d� d S d S rE   )r2   r8   ÚstrrH   r   r   r   rG   Ë   s   ÿzTermLogger.notec                 C   s   |   tj| jd�¡ d S )N)Ú	prog_name)r8   ÚUSAGEÚformatrK   ©r   r   r   r   rB   Ï   r%   zTermLogger.usagec                 C   s0   | j s|  | j | jjdi | j¤Ž¡¡ d S d S )Nr   )r1   rG   ÚcoloredÚcyanÚsplash_textrM   Úsplash_contextrN   r   r   r   r   Ó   s
   

ÿÿzTermLogger.splashc                 C   s   t j| j d�S )N)Úenabled)r   rO   r4   rN   r   r   r   rO   Ø   ó   zTermLogger.colored)FFFF)TNr   )T)Ú__name__Ú
__module__Ú__qualname__rQ   r   rR   Úretcoder5   r;   r8   r@   rD   rI   rG   r   rB   r   rO   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
--nosplashr1   )z--quietr2   )z-qr2   )z	--verboser3   )z
--no-colorr4   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Úcmdr5   r/   ÚfhrK   rY   rZ   r[   r\   r^   r_   r`   ra   rb   rc   Úcommands)r   rd   re   rf   r/   r0   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_optionsre   ÚosÚpathÚbasenameÚpoprK   Úvalidate_argumentsrD   Úcall_command)r   r   re   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   ro     rA   zMultiTool.validate_argumentsc                 C   s8   z
| j | |Ž p	tW S  ty   |  d |¡¡ Y S w )NzInvalid command: {0})rg   r   ÚKeyErrorrD   rM   )r   Úcommandr   r   r   r   rp     s
   ÿzMultiTool.call_commandc              
   C   s@   t |ƒ}| jD ]\}}||v rt| |t| | |¡¡ƒƒ q|S r   )ÚlistÚreserved_optionsÚsetattrÚboolrn   Úindex)r   r   ÚargÚattrr   r   r   rj     s   €z"MultiTool._handle_reserved_optionsc                 C   s   |   d¡ tt| ¡ ƒƒS )Nz> Starting nodes...)rG   ÚintÚanyrY   ©r   r*   r   r   r   rY     s   
zMultiTool.startc                 K   ó   |j dd|i|¤ŽS ©Nr+   r   )r[   ©r   r*   r+   r   r   r   r   r[   "  ó   zMultiTool.stopc                 K   r   r€   )r\   r�   r   r   r   r\   '  r‚   zMultiTool.stopwaitc                 K   s   t t|jdd|i|¤ŽƒƒS r€   )r|   r}   r^   r�   r   r   r   r^   -  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>4  s   € z"MultiTool.names.<locals>.<genexpr>)r8   Újoinr~   r   r   r   r`   2  s   zMultiTool.namesc                 G   s>   z
|   |¡ |¡}W n ty   t Y S w |  d |j¡¡S )Nú )r$   Úfindrs   r   r;   r‡   r   )r   Úwantedr   Únoder   r   r   rb   6  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†   @  s
   € 
ÿ
ÿz!MultiTool.show.<locals>.<genexpr>)r;   r‡   r~   r   r   r   rZ   >  s   
þzMultiTool.showc                 C   s   |  ¡ S r   )r_   r~   r   r   r   r_   E  s   zMultiTool.killc                    s$   |   d ‡ fdd„|  |¡D ƒ¡¡S )Nr<   c                 3   s   � | ]}|  ˆ ¡V  qd S r   )Úexpanderr�   ©Útemplater   r   r†   K  s
   € ÿ
ÿz#MultiTool.expand.<locals>.<genexpr>)r;   r‡   r$   )r   r�   r   r   r�   r   ra   J  s   
þzMultiTool.expandc                 G   s   |   t¡ d S r   )r8   Ú__doc__rr   r   r   r   rc   P  ó   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   rq   ri   )
r   ÚlenÚvaluesÚreversedr|   Ú
ValueErrorr   ÚsignumÚAttributeErrorÚ	TypeError)r   r)   Údefaultr   rz   r   r   r   r(   S  s    ÿÿýzMultiTool._find_sig_argumentc                 C   s:   |d ur|n| j }|  |¡}| ¡  || j|d� |¡fS ©N)re   )re   ÚOptionParserÚparser
   )r   r   re   r)   r   r   r   Ú_nodes_from_argvb  s   
zMultiTool._nodes_from_argvc                 C   s   | j ||d�\}}|S rœ   )r'   )r   r   re   Ú_r*   r   r   r   r$   h  s   zMultiTool.cluster_from_argvc                 C   s(   | j ||d�\}}|| jt|ƒ|d�fS rœ   )rŸ   r	   ru   )r   r   re   r)   Únodesr   r   r   r'   l  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 )Nre   rd   Ú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	   rd   r¢   r£   r¤   r¥   r¦   r§   r¨   r©   rª   r«   r¬   r­   r®   r¯   r°   )r   r¡   re   r   r   r   r	   p  sJ   ÿþýüûúùø	÷
öõôóòñðïîzMultiTool.Clusterc                 C   s   |   | j d¡¡ d S )Nz> Stopping nodes...)rG   rO   Úblue©r   r¡   r   r   r   r¢   †  ó   zMultiTool.on_stopping_preamblec                 C   s   |   d ||¡¡ d S )Nz	> {0.name}: {1} -> {0.pid}©rG   rM   ©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 {0} {1} -> {2}...r‹   z, c                 s   s   � | ]}t |jƒV  qd S r   )rJ   Úpidr�   r   r   r   r†   ’  s   € z1MultiTool.on_still_waiting_for.<locals>.<genexpr>FrF   )r”   rG   rO   r±   rM   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Ú.FrF   ©rG   r²   r   r   r   r¥   •  s   z#MultiTool.on_still_waiting_progressc                 C   s   |   d¡ d S )Nr=   r¹   rN   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 |¡dd� d S )Nz	> {0.name}: FrF   r´   rº   r   r   r   r§      r   zMultiTool.on_node_startc                 C   s    | j | j d |¡¡dd� d S )Nz> Restarting node {0.name}: FrF   )rG   rO   r±   rM   rº   r   r   r   r¨   £  s
   
ÿ
ÿzMultiTool.on_node_restartc                 C   ó   |   d || ¡¡ d S )Nz> {0.name}: {1.DOWN}r´   rº   r   r   r   r­   §  r³   zMultiTool.on_node_downc                 C   r»   )Nz
	> {0.name}: {1.OK}r´   rº   r   r   r   r©   ª  r³   zMultiTool.on_node_shutdown_okc                 C   s   |   |r| jp	| j¡ d S r   )rG   ÚFAILEDÚOK)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  {0})rI   rM   )r   r‹   Úargstrrd   r   r   r   r®   ´  rA   zMultiTool.on_child_spawnc                 C   r¿   )Nz$* Child was terminated by signal {0}r´   )r   r‹   r˜   r   r   r   r¯   ·  rA   zMultiTool.on_child_signalledc                 C   r¿   )Nz%* Child terminated with exit code {0}r´   )r   r‹   rX   r   r   r   r°   º  rA   zMultiTool.on_child_failurec                 C   ó   t | j d¡ƒS )Nr½   )rJ   rO   ÚgreenrN   r   r   r   r½   ½  rT   zMultiTool.OKc                 C   rÁ   )Nr¼   )rJ   rO   ÚredrN   r   r   r   r¼   Á  rT   zMultiTool.FAILEDc                 C   rÁ   )NÚDOWN)rJ   rO   ÚmagentarN   r   r   r   rÄ   Å  rT   zMultiTool.DOWN)NNNNNr   )5rU   rV   rW   r‘   r
   r   r�   rv   rh   r   ro   rp   rj   r   r&   rY   r,   r[   r\   r]   r^   r`   rb   rZ   r_   ra   rc   Ú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   Ú__main__)$r‘   Ú
__future__r   r   r   rk   rÆ   r   Ú	functoolsr   Úkombu.utils.objectsr   Úceleryr   Úcelery.apps.multir	   r
   r   Úcelery.platformsr   r   r   Úcelery.utilsr   Úcelery.utils.textr   Ú__all__rL   r   r   r&   r,   Úobjectr-   r   rU   r   r   r   r   Ú<module>   s0   ^	
8 n
ÿ