o
    ›¨Êh<  ã                   @   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   úB/var/www/html/env/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þþ