o
    ›¨Êh˜3  ã                   @   s   d 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 ddlmZ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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&m'Z' ddl(m)Z) dZ*e#e+ƒZ,ej -d¡Z.e/edƒZ0g d¢Z1dZ2dZ3dd„ Z4dd„ Z5G dd„ de)ƒZ6dddefd d!„Z7e
d"kr¹ee7d#d$ed%�Z8nee7d#dd&�Z8e.sËee7d"d$ed%�Z9nd'd(„  Z8Z9d)d*„ Z:e.sàee7d+e:ed,�Z;nd-d.„ Z;d/d0„ Z<d=d2d3„Z=d>d5d6„Z>	7	8d?d9d:„Z?d=d;d<„Z@dS )@zä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.
é    N)Údatetime)Úpartial)ÚREMAP_SIGTERM)Úcurrent_process)Úsafe_str)ÚVERSION_BANNERÚ	platformsÚsignals)Útrace)Ú	AppLoader)Ú
EX_FAILUREÚEX_OKÚcheck_privileges)Ú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'   úD/var/www/html/env/lib/python3.10/site-packages/celery/apps/worker.pyÚ	<genexpr>L   s   € 
ÿz&active_thread_count.<locals>.<genexpr>)Ú	threadingr!   Úsumr    r'   r'   r(   Úactive_thread_countJ   s   r,   c                 C   s   t d| › �tjdd� d S )NÚ
T©ÚfileÚflush)ÚprintÚsysÚ
__stderr__)Úmsgr'   r'   r(   Úsafe_sayP   s   r5   c                       sš   e Zd ZdZd#dd„Z		d$‡ fdd„	Zdd	„ Z‡ f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Úsendr8   r   Úaccept_content)Úselfr:   Úkwargsr'   r'   r(   Úon_before_initW   s   þzWorker.on_before_initNc                    sr   | j  d|¡| _| j  d|¡| _tƒ jdi |¤Ž || _|| _tj	 
¡ | _| j jj| j|d ur2| n|d�| _d S )NÚworker_redirect_stdoutsÚworker_redirect_stdouts_level)Úenabledr'   )r<   ÚeitherÚredirect_stdoutsÚredirect_stdouts_levelÚsuperÚsetup_defaultsÚpurgeÚno_colorr2   ÚstdoutÚisattyÚ_isattyÚlogÚcoloredÚlogfile)rA   rL   rM   rH   rI   rB   ©Ú	__class__r'   r(   Úon_after_initc   s   ÿÿþzWorker.on_after_initc                 C   s   |   ¡ | _t | j| j¡ d S ©N)Úsetup_loggingÚ_custom_loggingr
   r;   r<   r=   ©rA   r'   r'   r(   Úon_init_blueprints   s   
zWorker.on_init_blueprintc                    s´   | j }tƒ  ¡  tjj| j| |jd� | jr|  	¡  | j
s!|  ¡  |  d¡ |  | ¡ | js8| jr8|j | j¡ d}|j}t|tƒrH| ¡ dv}|rV|j ¡ rXt d¡ d S d S d S )N)r6   r7   r8   z-active-T)zdjango.conf:settingszPlease run `celery upgrade settings path/to/settings.py` to avoid these warnings and to allow a smoother upgrade to Celery 6.0.)r<   rJ   Úon_startr	   Úceleryd_after_setupr?   r=   r8   rL   Úpurge_messagesr:   Úemit_bannerÚset_process_statusÚinstall_platform_tweaksrY   rH   rQ   rI   Ú_config_sourceÚ
isinstanceÚstrÚlowerÚmaybe_warn_deprecated_settingsÚloggerÚwarning)rA   r<   Úwarn_deprecatedÚconfig_sourcerT   r'   r(   r\   y   s0   

ÿ



ÿþzWorker.on_startc                 C   sl   t  ¡ }|rtt  t ¡ ¡ƒ ttd t| j	 
d| j| d�¡ƒt| j	 |  ¡ p)d¡ƒg¡ƒtjdd� d S )NÚ z 
)ÚartlinesTr.   )r   Úsupports_imagesr1   Úimgcatr   Úlogor   Újoinrd   rR   ÚcyanÚstartup_infoÚresetÚ
extra_infor2   Ú
__stdout__)rA   Ú	use_imager'   r'   r(   r_   ¡   s   ÿý
üzWorker.emit_bannerc                 C   s$   t jj|d� t dt| jƒ¡ d S )N)r6   z	%s ready.)r	   Úworker_readyr?   rg   Úinfor   r=   )rA   Ú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)rH   Úcolorizer=   )rM   r<   rQ   ÚsetupÚloglevelrS   r=   )rA   r{   r'   r'   r(   rX   ±   s   þzWorker.setup_loggingc                 C   st   | j  ¡ �+}| j jj|d�}|r(td|› dt|dƒ› d�dd� W d   ƒ d S W d   ƒ d S 1 s3w   Y  d S )N)Ú
connectionzpurge: Erased ú Úmessagez from the queue.
T)r0   )r<   Úconnection_for_writeÚcontrolrL   r1   r   )rA   r~   Úcountr'   r'   r(   r^   ¹   s   "ý"þzWorker.purge_messagesTr-   úcelery.c                    s"   |  ‡ ‡fdd„t| jjƒD ƒ¡S )Nc                 3   s.   � | ]}ˆ s|  ˆ¡sn|rd |› �V  qdS )z  . N)r$   )r%   Útask©Úinclude_builtinsÚint_r'   r(   r)   À   s   € þþþ
ÿz"Worker.tasklist.<locals>.<genexpr>)rp   Úsortedr<   Útasks)rA   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Š   )r}   ÚloggingÚINFOÚDEBUGrŒ   ÚEXTRA_INFO_FMTÚformat)rA   r‡   rŒ   r'   r'   r(   rt   Å   s   
ýzWorker.extra_infoc                 C   s‚  | j }t| jƒ}d |jpdt|ƒ¡}t|jtƒs1t	|jƒ}| 
d¡r)|dd … }|d|› d�7 }| jrB| j\}}d|› d|› d	�}| j}t|tƒsM|j}|d| d
¡d › d�7 }d}	| jsad}	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{}:{:#x}Ú__main__zcelery.loadersé   ú (ú)z{min=z, max=Ú}Ú.éÿÿÿÿÚONz/OFF (enable -E to monitor tasks in this worker)r   )ÚmicrosecondF)ÚindentÚindent_first)
r<   r=   Ú	timestampÚversionÚconninfoÚresultsÚconcurrencyÚplatformÚeventsÚqueuesr   z                r-   )#r<   rd   r¡   r‘   ÚmainÚidrc   Úloaderr   r   r$   Ú	autoscaleÚpool_clsÚ
__module__ÚsplitÚtask_eventsÚBANNERr   r=   r   ÚnowÚreplacer   r~   Úas_uriÚbackendÚ	_platformr¢   Úamqpr¤   Ú
splitlinesr!   rp   ÚARTLINESÚ
IndexError)rA   rl   r<   r¡   Úapprr§   ÚmaxÚminÚpoolr£   ÚbannerÚiÚ_r'   r'   r(   rr   Í   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)r<   ÚIS_macOSÚ macOS_proxy_detection_workaroundrP   Ú!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)rA   Úworkerr'   r'   r(   ra   ÷   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Ú
setdefaultrZ   r'   r'   r(   r¿     s   z'Worker.macOS_proxy_detection_workaroundc                 C   s&   t jd|› dt  tj¡› d�| jd�S )NÚcelerydr”   r•   )rx   r=   )r   Úset_mp_process_titleÚstrargvr2   Úargvr=   )rA   rx   r'   r'   r(   r`     s
   ýzWorker.set_process_status)F)FNNNrW   )Tr-   r„   )T)Ú__name__rª   Ú__qualname__Ú__doc__rC   rV   r[   r\   r_   rz   rX   r^   rŒ   rt   rr   ra   r¿   r`   Ú__classcell__r'   r'   rT   r(   r   T   s$    
ÿ(


*r   ÚTERMÚWarmc                    s2   ‡ ‡‡‡‡fdd„}t dˆ› �ƒ|_|tjˆ< d S )Nc                     sŒ   t ƒ �9 ddlm} tƒ jdkr)ˆ rˆ ˆƒ tdˆ› d�ƒ tjjˆj	ˆˆˆd� t
|ddd	œˆ ˆƒ W d   ƒ d S 1 s?w   Y  d S )
Nr   ©ÚstateÚMainProcesszworker: z shutdown (MainProcess))r6   ÚsigÚhowÚexitcodeÚshould_stopÚshould_terminate)rÖ   ÚCold)r   Úcelery.workerrØ   r   Ú_namer5   r	   Úworker_shutting_downr?   r=   Úsetattr)ÚargsrØ   ©ÚcallbackrÜ   rÛ   rÚ   rÇ   r'   r(   Ú_handle_request  s$   þÿÿÿ"öz*_shutdown_handler.<locals>._handle_requestÚworker_)rd   rÑ   r   r	   )rÇ   rÚ   rÛ   ræ   rÜ   rç   r'   rå   r(   Ú_shutdown_handler  s   ré   ÚSIGQUITÚSIGTERMrß   )rÚ   rÛ   rÜ   )rÚ   rÛ   c                  O   ó   d S rW   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Ú   )r5   rÃ   )rÇ   r'   r'   r(   Ú	on_SIGINT?  s   rò   rð   )rÚ   ræ   rÜ   c                  O   rì   rW   r'   )rä   rB   r'   r'   r(   rÄ   J  s   rÄ   c                   C   s2   t  tjtjtjg¡ t tjtjgtj	 ¡ d S rW   )
r   Úclose_open_fdsr2   Ú	__stdin__ru   r3   rÊ   ÚexecvÚ
executablerÐ   r'   r'   r'   r(   Ú_reload_current_workerN  s   ÿr÷   ÚSIGHUPc                 C   s   dd„ }|t j|< d S )Nc                  W   sH   t dƒ tdd tj¡› d�ƒ ddl}| t¡ ddlm	} t
|_dS )z5Signal handler restarting the current python program.TzRestarting celery worker (r   r•   r   Nr×   )r   r5   rp   r2   rÐ   ÚatexitÚregisterr÷   rà   rØ   r   rÝ   )rä   rù   rØ   r'   r'   r(   Úrestart_worker_sig_handlerW  s   

zBinstall_worker_restart_handler.<locals>.restart_worker_sig_handler©r   r	   )rÇ   rÚ   rû   r'   r'   r(   rÁ   U  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   r5   r   )rä   r'   r'   r(   Úcry_handlerg  s   "ÿz(install_cry_handler.<locals>.cry_handler)Úis_pypyr   r	   )rÚ   rþ   r'   r'   r(   rÅ   b  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   )Ú_frameÚ	set_tracer"   N)r   Úcelery.contrib.rdbr  r  Úf_back)rä   r  r  Úframer'   r'   r(   Úrdb_handlerq  s
   
"ûz(install_rdb_handler.<locals>.rdb_handler)rÊ   rË   Úgetr   r	   )ÚenvvarrÚ   r  r'   r'   r(   rÆ   n  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   r5   r‘   )Úsignumr  rñ   r'   r(   Úwarn_on_HUP_handler  s
   
ÿ"ÿz>install_HUP_not_supported_handler.<locals>.warn_on_HUP_handlerrü   )rÇ   rÚ   r  r'   rñ   r(   rÀ   }  s   rÀ   )rø   )rý   )r   r  )ArÓ   r�   rÊ   r¢   r²   r2   r   Ú	functoolsr   Úbilliard.commonr   Úbilliard.processr   Úkombu.utils.encodingr   Úceleryr   r   r	   Ú
celery.appr
   Úcelery.loaders.appr   Úcelery.platformsr   r   r   Úcelery.utilsr   r   Úcelery.utils.debugr   Úcelery.utils.importsr   Úcelery.utils.logr   r   r   Úcelery.utils.textr   rà   r   Ú__all__rÑ   rg   r$   Ú	is_jythonÚhasattrrÿ   rµ   r­   r�   r,   r5   r   ré   rÂ   rÃ   rò   rÄ   r÷   rÁ   rÅ   rÆ   rÀ   r'   r'   r'   r(   Ú<module>   s~    
 F
ÿÿÿþÿþ


ÿ