o
    wvXj£1  ã                   @   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	Z	ddl
m
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 dd
lmZmZ ddlmZmZ ddlmZ ddlm Z m!Z!m"Z"m#Z# ddl$m%Z%m&Z& ddl'm(Z( ddl)m*Z* ddl+m,Z,m-Z-m.Z. ddl/m0Z0 ddl1m2Z2 dZ3e,e4ƒZ5e	j 6d¡Z7e8e	dƒZ9g d¢Z:dZ;dZ<dd„ Z=dd„ Z>G dd„ de2ƒZ?d d!ede!fd"d#„Z@ee@d$d!ed%�ZAe7s×ee@d&d'ee d(�ZBnd)d*„  ZAZBd+d,„ ZCe7sìee@d-eCe d.�ZDnd/d0„ ZDd1d2„ ZEd?d4d5„ZFd@d7d8„ZG	9	:dAd;d<„ZHd?d=d>„ZIdS )BzäWorker command-line program.

This module is the 'program-version' of :mod:`celery.worker`.

It does everything necessary to run that module
as an actual application, like installing signal handlers,
platform tweaks, and so on.
é    )Úabsolute_importÚprint_functionÚunicode_literalsN)Údatetime)Úpartial)Úcurrent_process)Úsafe_str)ÚVERSION_BANNERÚ	platformsÚsignals)Útrace)ÚWorkerShutdownÚWorkerTerminate)ÚstringÚstring_t)Ú	AppLoader)Ú
EX_FAILUREÚEX_OKÚcheck_privilegesÚisatty)ÚstaticÚterm)Úcry)Úqualname)Ú
get_loggerÚin_sighandlerÚset_in_sighandler)Ú	pluralize)ÚWorkController)ÚWorkerÚjavaÚpypy_version_info)ú --------------ú--- ***** -----ú-- ******* ----ú- *** --- * ---ú- ** ----------r&   r&   r&   r%   r$   r#   r"   zÍ{hostname} v{version}

{platform} {timestamp}

[config]
.> app:         {app}
.> transport:   {conninfo}
.> results:     {results}
.> concurrency: {concurrency}
.> task events: {events}

[queues]
{queues}
z
[tasks]
{tasks}
c                  C   s    ddl m}  tdd„ | ƒ D ƒƒS )Nr   ©Ú	enumeratec                 s   s    � | ]}|j  d ¡sdV  qdS )zDummy-é   N)ÚnameÚ
startswith)Ú.0Út© r.   úO/var/www/html/myproject/venv/lib/python3.10/site-packages/celery/apps/worker.pyÚ	<genexpr>P   s   € 
ÿz&active_thread_count.<locals>.<genexpr>)Ú	threadingr(   Úsumr'   r.   r.   r/   Úactive_thread_countN   s   r3   c                 C   s   t d | ¡tjd� d S )Nz
{0}©Úfile)ÚprintÚformatÚsysÚ
__stderr__)Úmsgr.   r.   r/   Úsafe_sayT   s   r;   c                       s–   e Zd ZdZd#dd„Z		d$‡ fdd„	Zdd	„ Zd
d„ Zdd„ Zdd„ Z	d%dd„Z
dd„ Zd&dd„Zdd„ Zd'dd„Zdd„ Zdd „ Zd!d"„ Z‡  ZS )(r   zWorker as a program.Fc                 K   sB   || _ t | j| j¡ tjj| j| | jj|d� t	| jjj
ƒ d S )N)ÚsenderÚinstanceÚconfÚoptions)Úquietr   Úsetup_worker_optimizationsÚappÚhostnamer   Úceleryd_initÚsendr>   r   Úaccept_content)Úselfr@   Úkwargsr.   r.   r/   Úon_before_init[   s   þzWorker.on_before_initNc                    sv   | j  d|¡| _| j  d|¡| _tt| ƒjdi |¤Ž || _|| _t	t
jƒ| _| j jj| j|d ur4| n|d�| _d S )NÚworker_redirect_stdoutsÚworker_redirect_stdouts_level)Úenabledr.   )rB   ÚeitherÚredirect_stdoutsÚredirect_stdouts_levelÚsuperr   Úsetup_defaultsÚpurgeÚno_colorr   r8   ÚstdoutÚ_isattyÚlogÚcoloredÚlogfile)rG   rR   rS   rN   rO   rH   ©Ú	__class__r.   r/   Úon_after_initg   s   ÿÿþzWorker.on_after_initc                 C   s   |   ¡ | _t | j| j¡ d S ©N)Úsetup_loggingÚ_custom_loggingr   rA   rB   rC   ©rG   r.   r.   r/   Úon_init_blueprintw   s   
zWorker.on_init_blueprintc                 C   s|   | j }t | ¡ tjj| j| |jd� | jr|  	¡  | j
s!|  ¡  |  d¡ |  | ¡ | js:| jr<|j | j¡ d S d S d S )N)r<   r=   r>   z-active-)rB   r   Úon_startr   Úceleryd_after_setuprE   rC   r>   rR   Úpurge_messagesr@   Úemit_bannerÚset_process_statusÚinstall_platform_tweaksr^   rN   rV   rO   )rG   rB   r.   r.   r/   ra   }   s   

ÿ

ÿzWorker.on_startc                 C   sj   t  ¡ }|rtt  t ¡ ¡ƒ ttd t| j	 
d| j| d�¡ƒt| j	 |  ¡ p)d¡ƒg¡ƒtjd� d S )NÚ z 
)Úartlinesr4   )r   Úsupports_imagesr6   Úimgcatr   Úlogor   Újoinr   rW   ÚcyanÚstartup_infoÚresetÚ
extra_infor8   Ú
__stdout__)rG   Ú	use_imager.   r.   r/   rd   ’   s   ÿý
üzWorker.emit_bannerc                 C   s$   t jj|d� t dt| jƒ¡ d S )N)r<   z	%s ready.)r   Úworker_readyrE   ÚloggerÚinfor   rC   )rG   Úconsumerr.   r.   r/   Úon_consumer_readyž   s   zWorker.on_consumer_readyc                 C   s8   |d u r| j d ur| j  }| jjj| j| jd|| jd�S )NF)rN   ÚcolorizerC   )rS   rB   rV   ÚsetupÚloglevelrX   rC   )rG   rx   r.   r.   r/   r]   ¢   s   þzWorker.setup_loggingc                 C   sj   | j  ¡ �&}| j jj|d�}|r#td |t|dƒ¡ƒ W d   ƒ d S W d   ƒ d S 1 s.w   Y  d S )N)Ú
connectionz&purge: Erased {0} {1} from the queue.
Úmessage)rB   Úconnection_for_writeÚcontrolrR   r6   r7   r   )rG   r{   Úcountr.   r.   r/   rc   ª   s   
ÿý"þzWorker.purge_messagesTÚ
úcelery.c                    s"   |  ‡ ‡fdd„t| jjƒD ƒ¡S )Nc                 3   s.   � | ]}ˆ s|  ˆ¡sn|rd  |¡V  qdS )z  . {0}N)r+   r7   )r,   Útask©Úinclude_builtinsÚint_r.   r/   r0   ²   s   € þþþ
ÿz"Worker.tasklist.<locals>.<genexpr>)rl   ÚsortedrB   Útasks)rG   r„   Úsepr…   r.   rƒ   r/   Útasklist±   s   
ÿzWorker.tasklistc                 C   sB   | j d u rd S | j tjkr| j tjk}| j|d�}tj|d�S d S )N)r„   )r‡   )rz   ÚloggingÚINFOÚDEBUGr‰   ÚEXTRA_INFO_FMTr7   )rG   r„   r‰   r.   r.   r/   rp   ·   s   
ýzWorker.extra_infoc                 C   sx  | j }t| jƒ}d |jpdt|ƒ¡}t|jtƒs0t	|jƒ}| 
d¡r)|dd … }|d |¡7 }| jr>| j\}}d ||¡}| j}t|tƒsI|j}|d | d¡d ¡7 }d	}	| js\d
}	tj|t| jƒt ¡ jdd�t| j  ¡  ¡ | j j ¡ |tt ¡ ƒ|	|jjjddd�d�
 ¡ }
|rµt |
ƒD ]$\}}zd !t"| |
| g¡|
|< W q� t#y´   d|
|  |
|< Y q�w d !|
¡d S )Nz
{0}:{1:#x}Ú__main__zcelery.loadersé   z ({0})z{{min={0}, max={1}}}Ú.éÿÿÿÿÚONz/OFF (enable -E to monitor tasks in this worker)r   )ÚmicrosecondF)ÚindentÚindent_first)
rB   rC   Ú	timestampÚversionÚconninfoÚresultsÚconcurrencyÚplatformÚeventsÚqueuesú z                r€   )$rB   r   rš   r7   ÚmainÚidÚ
isinstanceÚloaderr   r   r+   Ú	autoscaleÚpool_clsr   Ú
__module__ÚsplitÚtask_eventsÚBANNERr   rC   r   ÚnowÚreplacer	   r{   Úas_uriÚbackendÚ	_platformr›   Úamqpr�   Ú
splitlinesr(   rl   ÚARTLINESÚ
IndexError)rG   rh   rB   rš   Úapprr¢   ÚmaxÚminÚpoolrœ   ÚbannerÚiÚ_r.   r.   r/   rn   ¿   sP   






öõÿzWorker.startup_infoc                 C   sX   | j jr|  ¡  | js| j jrt|ƒ nt|ƒ t|ƒ t|ƒ t|ƒ t	ƒ  t
ƒ  dS )z1Install platform specific tweaks and workarounds.N)rB   ÚIS_macOSÚ macOS_proxy_detection_workaroundrU   Ú!install_HUP_not_supported_handlerÚinstall_worker_restart_handlerÚinstall_worker_term_handlerÚ install_worker_term_hard_handlerÚinstall_worker_int_handlerÚinstall_cry_handlerÚinstall_rdb_handler)rG   Úworkerr.   r.   r/   rf   é   s   

zWorker.install_platform_tweaksc                 C   s   t j dd¡ dS )z6See https://github.com/celery/celery/issues#issue/161.Úcelery_dummy_proxyÚset_by_celerydN)ÚosÚenvironÚ
setdefaultr_   r.   r.   r/   rº   ÿ   s   z'Worker.macOS_proxy_detection_workaroundc                 C   s"   t jdd |t  tj¡¡| jd�S )NÚcelerydz	{0} ({1}))ru   rC   )r
   Úset_mp_process_titler7   Ústrargvr8   ÚargvrC   )rG   ru   r.   r.   r/   re     s
   ýzWorker.set_process_status)F)FNNNr\   )Tr€   r�   )T)Ú__name__r¥   Ú__qualname__Ú__doc__rI   r[   r`   ra   rd   rw   r]   rc   r‰   rp   rn   rf   rº   re   Ú__classcell__r.   r.   rY   r/   r   X   s$    
ÿ


*r   ÚTERMÚWarmc                    s4   ‡ ‡‡‡‡‡fdd„}t d ˆ¡ƒ|_|tjˆ< d S )Nc                     sž   t ƒ �B ddlm} tƒ jdkr(ˆ rˆ ˆƒ td ˆ¡ƒ tjj	ˆj
ˆˆˆd� tƒ dkr9t|ddd	œˆ ˆƒ nˆˆƒ‚W d   ƒ d S 1 sHw   Y  d S )
Nr   ©ÚstateÚMainProcessz"worker: {0} shutdown (MainProcess))r<   ÚsigÚhowÚexitcoder)   Úshould_stopÚshould_terminate)rÑ   ÚCold)r   Úcelery.workerrÓ   r   Ú_namer;   r7   r   Úworker_shutting_downrE   rC   r3   Úsetattr)ÚargsrÓ   ©ÚcallbackÚexcr×   rÖ   rÕ   rÂ   r.   r/   Ú_handle_request  s*   þ
ÿÿÿý"õz*_shutdown_handler.<locals>._handle_requestz
worker_{0})Ústrr7   rÌ   r
   r   )rÂ   rÕ   rÖ   râ   rá   r×   rã   r.   rà   r/   Ú_shutdown_handler  s   rå   ÚSIGTERM)rÕ   rÖ   râ   ÚSIGQUITrÚ   )rÕ   rÖ   râ   r×   c                  O   ó   d S r\   r.   )ÚaÚkwr.   r.   r/   Ú<lambda>+  s    rë   c                 C   s   t dƒ t| dd� d S )Nz>worker: Hitting Ctrl+C again will terminate all running tasks!ÚSIGINT©rÕ   )r;   r¾   )rÂ   r.   r.   r/   Ú	on_SIGINT.  s   rî   rì   )rÕ   rá   r×   c                  O   rè   r\   r.   )rß   rH   r.   r.   r/   r¿   9  s   r¿   c                   C   s2   t  tjtjtjg¡ t tjtjgtj	 ¡ d S r\   )
r
   Úclose_open_fdsr8   Ú	__stdin__rq   r9   rÅ   ÚexecvÚ
executablerË   r.   r.   r.   r/   Ú_reload_current_worker=  s   ÿró   ÚSIGHUPc                 C   s   dd„ }|t j|< d S )Nc                  W   sF   t dƒ td d tj¡¡ƒ ddl}| t¡ ddl	m
} t|_dS )z5Signal handler restarting the current python program.TzRestarting celery worker ({0})rž   r   NrÒ   )r   r;   r7   rl   r8   rË   ÚatexitÚregisterró   rÛ   rÓ   r   rØ   )rß   rõ   rÓ   r.   r.   r/   Úrestart_worker_sig_handlerF  s   

zBinstall_worker_restart_handler.<locals>.restart_worker_sig_handler©r
   r   )rÂ   rÕ   r÷   r.   r.   r/   r¼   D  s   r¼   ÚSIGUSR1c                 C   s   t rd S dd„ }|tj| < d S )Nc                  W   s6   t ƒ � ttƒ ƒ W d  ƒ dS 1 sw   Y  dS )z=Signal handler logging the stack-trace of all active threads.N)r   r;   r   )rß   r.   r.   r/   Úcry_handlerV  s   "ÿz(install_cry_handler.<locals>.cry_handler)Úis_pypyr
   r   )rÕ   rú   r.   r.   r/   rÀ   Q  s   rÀ   ÚCELERY_RDBSIGÚSIGUSR2c                 C   s&   dd„ }t j | ¡r|tj|< d S d S )Nc                  W   sX   t ƒ � ddlm}m} | r| d n|ƒ j}||ƒ W d  ƒ dS 1 s%w   Y  dS )z=Signal handler setting a rdb breakpoint at the current frame.r   )Ú	set_traceÚ_framer)   N)r   Úcelery.contrib.rdbrþ   rÿ   Úf_back)rß   rþ   rÿ   Úframer.   r.   r/   Úrdb_handler`  s
   
"üz(install_rdb_handler.<locals>.rdb_handler)rÅ   rÆ   Úgetr
   r   )ÚenvvarrÕ   r  r.   r.   r/   rÁ   ]  s   ÿrÁ   c                    s   ‡ fdd„}|t jˆ < d S )Nc                    s<   t ƒ � tdjˆ d�ƒ W d   ƒ d S 1 sw   Y  d S )NzH{sig} not supported: Restarting with {sig} is unstable on this platform!rí   )r   r;   r7   )Úsignumr  rí   r.   r/   Úwarn_on_HUP_handlerm  s
   
ÿ"ÿz>install_HUP_not_supported_handler.<locals>.warn_on_HUP_handlerrø   )rÂ   rÕ   r  r.   rí   r/   r»   k  s   r»   )rô   )rù   )rü   rý   )JrÎ   Ú
__future__r   r   r   rŠ   rÅ   r›   r­   r8   r   Ú	functoolsr   Úbilliard.processr   Úkombu.utils.encodingr   Úceleryr	   r
   r   Ú
celery.appr   Úcelery.exceptionsr   r   Úcelery.fiver   r   Úcelery.loaders.appr   Úcelery.platformsr   r   r   r   Úcelery.utilsr   r   Úcelery.utils.debugr   Úcelery.utils.importsr   Úcelery.utils.logr   r   r   Úcelery.utils.textr   rÛ   r   Ú__all__rÌ   rt   r+   Ú	is_jythonÚhasattrrû   r°   r¨   r�   r3   r;   r   rå   r½   r¾   rî   r¿   ró   r¼   rÀ   rÁ   r»   r.   r.   r.   r/   Ú<module>   sz   
 4
ÿÿþÿþ


ÿ