U
    .e!                     @   sH  d Z ddlZddl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
mZ ddlmZ ddlmZ ddlmZmZ ddlmZ d	Zd
ee dZeejddZeejddZeejddZeejddZi Z e! Z"e! Z#eeedZ$e Z%dgZ&eeedZ'i Z(dZ)dZ*dd Z+dd Z,e j-e"j.fddZ/de j-e#j.e%j0fddZ1de j2e#j3e"j3fddZ4ejdpejd Z5eejd!pejd"pdZ6e5r6ddl7Z7dd#l8m9Z9 dd$l:m;Z; dd%l<m=Z=m>Z> da?da@daAdaBe6ZCg ZDe/ZEe4ZFe; jGd&kr&e7jHd'd( ZId)d Z/d*d Z4G d+d, d,ZJdS )-zwInternal worker state (global).

This includes the currently active and reserved tasks,
statistics, and revoked tasks.
    N)Counter)picklepickle_protocol)cached_property)__version__)WorkerShutdownWorkerTerminate)
LimitedSet)
SOFTWARE_INFOreserved_requestsactive_requeststotal_countrevokedtask_reservedmaybe_shutdowntask_accepted
task_ready
Persistentz	py-celery)Zsw_identZsw_verZsw_sysZCELERY_WORKER_REVOKES_MAXiP  ZCELERY_WORKER_SUCCESSFUL_MAXi  ZCELERY_WORKER_REVOKE_EXPIRESi0*  Z CELERY_WORKER_SUCCESSFUL_EXPIRES)maxlenexpiresc                   C   sJ   t   t  t  t  t  dgtd d < t  t  d S )Nr   )	requestsclearr   r   successful_requestsr   all_total_countr   revoked_stamps r   r   7/tmp/pip-unpacked-wheel-f4liivr4/celery/worker/state.pyreset_stateM   s    r   c                   C   s6   t dk	rt dk	rtt ntdk	r2tdk	r2ttdS )z Shutdown if flags have been set.NF)should_terminater   should_stopr   r   r   r   r   r   X   s    
r   c                 C   s   || j |  ||  dS )z2Update global state when a task has been reserved.N)id)requestadd_requestZadd_reserved_requestr   r   r   r   `   s    r   c                 C   s>   |st }|| j|  ||  || jdi t d  d7  < dS )z2Update global state when a task has been accepted.   r   N)r   r    name)r!   Z_all_total_countr"   Zadd_active_requestZadd_to_total_countr   r   r   r   h   s    r   Fc                 C   s0   |rt | j || jd ||  ||  dS )z)Update global state when a task is ready.N)r   addr    )r!   Z
successfulZremove_requestZdiscard_active_requestZdiscard_reserved_requestr   r   r   r   v   s
    r   C_BENCHZCELERY_BENCHC_BENCH_EVERYZCELERY_BENCH_EVERY)	monotonic)current_process)memdump
sample_memMainProcessc                   C   sF   t d k	rBtd k	rBtdtt   tdtttt  t  d S )Nz- Time spent in benchmark: {!r}z	- Avg: {})bench_first
bench_lastprintformatsumbench_samplelenr*   r   r   r   r   on_shutdown   s    r4   c                 C   s*   d}t dkrt  a }tdkr"|at| S )z-Called when a task is reserved by the worker.N)bench_startr(   r-   
__reserved)r!   nowr   r   r   r      s    
c                 C   sX   t d7 a t t sPt }|t }tdt| tj  | aa	t
| t  t| S )z Called when a task is completed.r#   zG- Time spent processing {} tasks (since first task received): ~{:.4f}s
)	all_countbench_everyr(   r5   r/   r0   sysstdoutflushr.   r2   appendr+   __ready)r!   r7   Zdiffr   r   r   r      s     

c                   @   s   e Zd ZdZeZeZej	Z	ej
Z
dZd$ddZdd Zdd	 Zd
d Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zed d! Zed"d# ZdS )%r   zStores worker state between restarts.

    This is the persistent data stored by the worker when
    :option:`celery worker --statedb` is enabled.

    Currently only stores revoked task id's.
    FNc                 C   s   || _ || _|| _|   d S N)statefilenameclockmerge)selfr@   rA   rB   r   r   r   __init__   s    zPersistent.__init__c                 C   s   | j j| j| jddS )NT)protocolZ	writeback)storageopenrA   rF   rD   r   r   r   rH      s
      zPersistent.openc                 C   s   |  | j d S r?   )_merge_withdbrI   r   r   r   rC      s    zPersistent.mergec                 C   s   |  | j | j  d S r?   )
_sync_withrK   syncrI   r   r   r   rM      s    zPersistent.syncc                 C   s   | j r| j  d| _ d S )NF)_is_openrK   closerI   r   r   r   rO      s    
zPersistent.closec                 C   s   |    |   d S r?   )rM   rO   rI   r   r   r   save   s    zPersistent.savec                 C   s   |  | | | |S r?   )_merge_revoked_merge_clockrD   dr   r   r   rJ      s    

zPersistent._merge_withc                 C   s>   | j   |d| | | j | jr0| j ndd |S )N   r   )Z	__proto__zrevokedrB   )_revoked_taskspurgeupdatecompress_dumpsrB   ZforwardrS   r   r   r   rL      s    
zPersistent._sync_withc                 C   s$   | j r | j |dpd|d< d S )NrB   r   )rB   adjustgetrS   r   r   r   rR      s    zPersistent._merge_clockc                 C   s`   z|  |d  W n> tk
rP   z| |d W n tk
rJ   Y nX Y nX | j  d S )NrV   r   )_merge_revoked_v3KeyError_merge_revoked_v2poprW   rX   rS   r   r   r   rQ      s    zPersistent._merge_revokedc                 C   s    |r| j t| | d S r?   )rW   rY   r   loads
decompress)rD   rV   r   r   r   r^     s    zPersistent._merge_revoked_v3c                 C   s$   t |ts| |S | j| d S r?   )
isinstancer	   _merge_revoked_v1rW   rY   )rD   savedr   r   r   r`     s    

zPersistent._merge_revoked_v2c                 C   s   | j j}|D ]}|| qd S r?   )rW   r%   )rD   rf   r%   itemr   r   r   re     s    zPersistent._merge_revoked_v1c                 C   s   t j|| jdS )N)rF   )r   dumpsrF   )rD   objr   r   r   r[     s    zPersistent._dumpsc                 C   s   | j jS r?   )r@   r   rI   r   r   r   rW     s    zPersistent._revoked_tasksc                 C   s   d| _ |  S )NT)rN   rH   rI   r   r   r   rK     s    zPersistent.db)N)__name__
__module____qualname____doc__shelverG   r   rF   zlibrZ   rc   rN   rE   rH   rC   rM   rO   rP   rJ   rL   rR   rQ   r^   r`   re   r[   propertyrW   r   rK   r   r   r   r   r      s0   
	
r   )Krm   osplatformrn   r:   weakrefro   collectionsr   Zkombu.serializationr   r   Zkombu.utils.objectsr   Zceleryr   Zcelery.exceptionsr   r   Zcelery.utils.collectionsr	   __all__systemr
   intenvironr]   ZREVOKES_MAXZSUCCESSFUL_MAXfloatZREVOKE_EXPIRESZSUCCESSFUL_EXPIRESr   WeakSetr   r   r   r   r   r   r   r   r   r   r   __setitem__r%   r   rY   r   ra   discardr   r&   r'   atexittimer(   Zbilliard.processr)   Zcelery.utils.debugr*   r+   r8   r-   r5   r.   r9   r2   r6   r>   _nameregisterr4   r   r   r   r   r   <module>   s   	
	



