U
    Z+d                     @   s   d 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 ddlmZ dd	lmZ d
ZedZG dd dZdddZdS )aS  Periodically store events in a database.

Consuming the events as a stream isn't always suitable
so this module implements a system to take snapshots of the
state of a cluster at regular intervals.  There's a full
implementation of this writing the snapshots to a database
in :mod:`djcelery.snapshots` in the `django-celery` distribution.
    )TokenBucket)	platforms)app_or_default)Signal)instantiate)
get_logger)rate)Timer)Polaroidevcamzcelery.evcamc                   @   s   e Zd ZdZdZeddhdZeddZdZd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S ) r
   zRecord event snapshots.Nshutter_signalstate)nameZproviding_argscleanup_signal)r   F      ?      @c                 C   sJ   t || _|| _|| _|| _|p*| jp*t | _t| _|oBtt	|| _
d S N)r   appr   freqcleanup_freqtimerr	   loggerr   r   maxrate)selfr   r   r   r   r   r    r   :/tmp/pip-unpacked-wheel-ucduq0nd/celery/events/snapshot.py__init__#   s    
zPolaroid.__init__c                 C   s,   | j | j| j| _| j | j| j| _d S r   )r   Zcall_repeatedlyr   capture_trefr   cleanup_ctrefr   r   r   r   install-   s
     zPolaroid.installc                 C   s   d S r   r   )r   r   r   r   r   
on_shutter3   s    zPolaroid.on_shutterc                 C   s   d S r   r   r!   r   r   r   
on_cleanup6   s    zPolaroid.on_cleanupc                 C   s&   t d | jj| jd |   d S )NzCleanup: Running...Zsender)r   debugr   sendr   r$   r!   r   r   r   r   9   s    
zPolaroid.cleanupc                 C   sB   | j d ks| j  r>td| j | jj| jd | | j d S )NzShutter: %sr%   )r   Zcan_consumer   r&   r   r   r'   r#   r!   r   r   r   shutter>   s    zPolaroid.shutterc                 C   s   | j j| j| jd d S )N)clear_after)r   Zfreeze_whiler(   r)   r!   r   r   r   r   D   s    zPolaroid.capturec                 C   s,   | j r|    | j   | jr(| j  d S r   )r   cancelr    r!   r   r   r   r*   G   s
    
zPolaroid.cancelc                 C   s   |    | S r   )r"   r!   r   r   r   	__enter__N   s    zPolaroid.__enter__c                 G   s   |    d S r   )r*   )r   exc_infor   r   r   __exit__R   s    zPolaroid.__exit__)r   Nr   NN)__name__
__module____qualname____doc__r   r   r   r   r)   r   r    r   r"   r#   r$   r   r(   r   r*   r+   r-   r   r   r   r   r
      s*   
      

r
   r   Nc                 K   s   t |}|rt| |j|| td|  d| d |j }	t| |	||||d}
|
	  |
 }|jj|d|	jid}z.z|jdd W n tk
r   tY nX W 5 |
  |  X dS )	zStart snapshot recorder.z -> evcam: Taking snapshots with z (every z secs.))r   r   r   r   *)handlersN)limit)r   r   Zcreate_pidlocklogZsetup_logging_subsystemprinteventsStater   r"   Zconnection_for_readZReceivereventr*   closer   KeyboardInterrupt
SystemExit)Zcamerar   r   ZloglevellogfileZpidfiler   r   kwargsr   Zcamconnrecvr   r   r   r   V   s(    


 r   )r   Nr   NNNN)r1   Zkombu.utils.limitsr   Zceleryr   Z
celery.appr   Zcelery.utils.dispatchr   Zcelery.utils.importsr   Zcelery.utils.logr   Zcelery.utils.timer   Zcelery.utils.timer2r	   __all__r   r
   r   r   r   r   r   <module>   s"   >        