
P'^c           @@ 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
 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 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 d l' m( Z( m) Z) m* Z* d d l+ m, Z, d d l- m. Z. d g Z/ e( e0  Z1 e	 j j2 d  Z3 e4 e	 d  Z5 d Z6 d   Z7 d   Z8 d d d d d d d d d d d d g Z9 d  Z: d! Z; d" e. f d#     YZ< d$ d% e d d&  Z> e e> d' d( d) d% d* e Z? e3 sbe e> d' d+ d) d, d* e Z@ n d-   Z? Z@ d.   ZA e3 se e> d' d/ d0 eA ZB n	 d1   ZB d2   ZC d3 d4  ZD d5 d6  ZE d7 d8 d9  ZF d3 d:  ZG d S(;   u  
    celery.apps.worker
    ~~~~~~~~~~~~~~~~~~

    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.

i    (   t   absolute_importt   print_functiont   unicode_literalsN(   t   partial(   t   current_process(   t   safe_str(   t   VERSION_BANNERt	   platformst   signals(   t   trace(   t   CDeprecationWarningt   WorkerShutdownt   WorkerTerminate(   t   stringt   string_t(   t	   AppLoader(   t   check_privileges(   t   cryt   isatty(   t   qualname(   t
   get_loggert   in_sighandlert   set_in_sighandler(   t	   pluralize(   t   WorkControlleru   Workeru   javau   pypy_version_infou  
Starting from version 3.2 Celery will refuse to accept pickle by default.

The pickle serializer is a security concern as it may give attackers
the ability to execute any command.  It's important to secure
your broker from unauthorized access when using pickle, so we think
that enabling pickle should require a deliberate action and not be
the default choice.

If you depend on pickle then you should set a setting to disable this
warning and to be sure that everything will continue working
when you upgrade to Celery 3.2::

    CELERY_ACCEPT_CONTENT = ['pickle', 'json', 'msgpack', 'yaml']

You must only enable the serializers that you will actually use.

c          C@ s'   d d l  m }  t d   |    D  S(   Ni    (   t	   enumeratec         s@ s'   |  ] } | j  j d   s d Vq d S(   u   Dummy-i   N(   t   namet
   startswith(   t   .0t   t(    (    s4   /tmp/pip-unpacked-wheel-gV1wwp/celery/apps/worker.pys	   <genexpr>D   s    (   t	   threadingR   t   sum(   R   (    (    s4   /tmp/pip-unpacked-wheel-gV1wwp/celery/apps/worker.pyt   active_thread_countB   s    c         C@ s    t  d j |   d t j d  S(   Nu   
{0}t   file(   t   printt   formatt   syst
   __stderr__(   t   msg(    (    s4   /tmp/pip-unpacked-wheel-gV1wwp/celery/apps/worker.pyt   safe_sayH   s    u    --------------u   ---- **** -----u   --- * ***  * --u   -- * - **** ---u   - ** ----------u   - *** --- * ---u   -- ******* ----u   --- ***** -----u   {hostname} v{version}

{platform}

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

[queues]
{queues}
u   
[tasks]
{tasks}
t   Workerc           B@ s   e  Z d    Z e d d d d  Z d   Z d   Z d   Z d d  Z	 d   Z
 e d d d	  Z d
   Z d   Z d   Z d   Z d   Z RS(   c      	   K@ sU   t  j |  j  t j j d |  j d |  d |  j j d |  t |  j j j	  d  S(   Nt   sendert   instancet   conft   options(
   R	   t   setup_worker_optimizationst   appR   t   celeryd_initt   sendt   hostnameR+   R   t   CELERY_ACCEPT_CONTENT(   t   selft   kwargs(    (    s4   /tmp/pip-unpacked-wheel-gV1wwp/celery/apps/worker.pyt   on_before_initq   s
    c         K@ s   |  j  d |  |  _ |  j  d |  |  _ t t |   j |   | |  _ | |  _ t t	 j
  |  _ |  j j j |  j d | d  k	 r | n | |  _ d  S(   Nu   redirect_stdoutsu   redirect_stdouts_levelt   enabled(   t   _getoptt   redirect_stdoutst   redirect_stdouts_levelt   superR(   t   setup_defaultst   purget   no_colorR   R$   t   stdoutt   _isattyR.   t   logt   coloredt   logfilet   None(   R3   R<   R=   R8   R9   R4   (    (    s4   /tmp/pip-unpacked-wheel-gV1wwp/celery/apps/worker.pyt   on_after_init|   s    			c         C@ s#   |  j    |  _ t j |  j  d  S(   N(   t   setup_loggingt   _custom_loggingR	   R-   R.   (   R3   (    (    s4   /tmp/pip-unpacked-wheel-gV1wwp/celery/apps/worker.pyt   on_init_blueprint   s    c         C@ s!  |  j  r, |  j r, |  j j j |  j  n  t j |   t j j	 d |  j
 d |  d |  j j  |  j j j d  s t j t t   n  |  j r |  j   n  t t d j t |  j j d |  j     t |  j j |  j   p d   g   d t j |  j d  |  j |   d  S(	   NR)   R*   R+   u   CELERY_ACCEPT_CONTENTu    u    
R!   u   -active-(    RF   R8   R.   R@   R9   R   t   on_startR   t   celeryd_after_setupR0   R1   R+   t   value_set_fort   warningst   warnR
   t   W_PICKLE_DEPRECATEDR<   t   purge_messagesR"   R   t   joinR   RA   t   cyant   startup_infot   resett
   extra_infoR$   t
   __stdout__t   set_process_statust   install_platform_tweaks(   R3   (    (    s4   /tmp/pip-unpacked-wheel-gV1wwp/celery/apps/worker.pyRH      s    	-
c         C@ s3   t  j j d |  t d j t |  j    d  S(   NR)   u
   {0} ready.(   R   t   worker_readyR0   R"   R#   R   R1   (   R3   t   consumer(    (    s4   /tmp/pip-unpacked-wheel-gV1wwp/celery/apps/worker.pyt   on_consumer_ready   s    c      	   C@ sY   | d  k r( |  j d  k	 r( |  j } n  |  j j j |  j |  j d t d | d |  j S(   NR8   t   colorizeR1   (	   RC   R=   R.   R@   t   setupt   loglevelRB   t   FalseR1   (   R3   RZ   (    (    s4   /tmp/pip-unpacked-wheel-gV1wwp/celery/apps/worker.pyRE      s
    c         C@ s>   |  j  j j   } | r: t d j | t | d    n  d  S(   Nu&   purge: Erased {0} {1} from the queue.
u   message(   R.   t   controlR<   R"   R#   R   (   R3   t   count(    (    s4   /tmp/pip-unpacked-wheel-gV1wwp/celery/apps/worker.pyRN      s    	u   
u   celery.c         @ s,   | j     f d   t |  j j  D  S(   Nc         3@ s:   |  ]0 }   s | j    n | r d  j |  Vq d S(   u     . {0}N(   R   R#   (   R   t   task(   t   include_builtinst   int_(    s4   /tmp/pip-unpacked-wheel-gV1wwp/celery/apps/worker.pys	   <genexpr>   s    (   RO   t   sortedR.   t   tasks(   R3   Ra   t   sepRb   (    (   Ra   Rb   s4   /tmp/pip-unpacked-wheel-gV1wwp/celery/apps/worker.pyt   tasklist   s    c         C@ sJ   |  j  t j k rF |  j  t j k } |  j d |  } t j d |  Sd  S(   NRa   Rd   (   R\   t   loggingt   INFOt   DEBUGRf   t   EXTRA_INFO_FMTR#   (   R3   Ra   Rf   (    (    s4   /tmp/pip-unpacked-wheel-gV1wwp/celery/apps/worker.pyRS      s    c         C@ s  |  j  } t |  j  } d j | j p* d t |   } t | j t  s t	 | j  } | j
 d  rv | d } n  | d j |  7} n  |  j r |  j \ } } d j | |  } n  |  j } t | t  s | j } n  | d j | j d  d  7} d	 } |  j sd
 } n  t j d | d t |  j  d t d |  j  j   j   d |  j  j j   d | d t t j    d | d | j j j d d d t   	j   }	 xe t |	  D]W \ }
 } y% d j t  |
 |	 |
 g  |	 |
 <Wqt! k
 rd |	 |
 |	 |
 <qXqWd j |	  d S(   Nu   {0}:0x{1:x}u   __main__u   celery.loadersi   u    ({0})u   {{min={0}, max={1}}}u   .iu   ONu&   OFF (enable -E to monitor this worker)R.   R1   t   versiont   conninfot   resultst   concurrencyt   platformt   eventst   queuest   indenti    t   indent_firstu    i   u   
u                   ("   R.   R   Rn   R#   t   maint   idt
   isinstancet   loaderR   R   R   t	   autoscalet   pool_clsR   t
   __module__t   splitt   send_eventst   BANNERR   R1   R   t
   connectiont   as_urit   backendt	   _platformRo   t   amqpRq   R]   t
   splitlinesR   RO   t   ARTLINESt
   IndexError(   R3   R.   Rn   t   apprRw   t   maxt   mint   poolRp   t   bannert   it   x(    (    s4   /tmp/pip-unpacked-wheel-gV1wwp/celery/apps/worker.pyRQ      sD    	!		 			'%c         C@ sx   |  j  j r |  j   n  |  j sH |  j  j r; t |  qH t |  n  t |  t |  t |  t	   t
   d S(   u1   Install platform specific tweaks and workarounds.N(   R.   t   IS_OSXt   osx_proxy_detection_workaroundR?   t!   install_HUP_not_supported_handlert   install_worker_restart_handlert   install_worker_term_handlert    install_worker_term_hard_handlert   install_worker_int_handlert   install_cry_handlert   install_rdb_handler(   R3   t   worker(    (    s4   /tmp/pip-unpacked-wheel-gV1wwp/celery/apps/worker.pyRV      s    	


c         C@ s   t  j j d d  d S(   u4   See http://github.com/celery/celery/issues#issue/161u   celery_dummy_proxyu   set_by_celerydN(   t   ost   environt
   setdefault(   R3   (    (    s4   /tmp/pip-unpacked-wheel-gV1wwp/celery/apps/worker.pyR     s    c         C@ s4   t  j d d d j | t  j t j   d |  j S(   Nu   celerydt   infou	   {0} ({1})R1   (   R   t   set_mp_process_titleR#   t   strargvR$   t   argvR1   (   R3   R   (    (    s4   /tmp/pip-unpacked-wheel-gV1wwp/celery/apps/worker.pyRU     s    N(   t   __name__Rz   R5   R]   RC   RD   RG   RH   RY   RE   RN   t   TrueRf   RS   RQ   RV   R   RU   (    (    (    s4   /tmp/pip-unpacked-wheel-gV1wwp/celery/apps/worker.pyR(   o   s   							(		u   TERMu   Warmc         @ sA        f d   } t  d j    | _ | t j | <d  S(   Nc       	   @ s   t     d d l m } t   j d k rU   r?     n  t d j    n  t   d k r t | i d d 6d d	 6 t	  n	     Wd  QXd  S(
   Ni    (   t   stateu   MainProcessu"   worker: {0} shutdown (MainProcess)i   u   should_stopu   Warmu   should_terminateu   Cold(
   R   t   celery.workerR   R   t   _nameR'   R#   R    t   setattrR   (   t   argsR   (   t   callbackt   exct   howR   (    s4   /tmp/pip-unpacked-wheel-gV1wwp/celery/apps/worker.pyt   _handle_request  s    
u
   worker_{0}(   t   strR#   R   R   R   (   R   t   sigR   R   R   R   (    (   R   R   R   R   s4   /tmp/pip-unpacked-wheel-gV1wwp/celery/apps/worker.pyt   _shutdown_handler  s    R   u   SIGTERMR   R   u   SIGQUITu   Coldc          O@ s   d  S(   N(   RC   (   t   at   kw(    (    s4   /tmp/pip-unpacked-wheel-gV1wwp/celery/apps/worker.pyt   <lambda>1  t    c         C@ s   t  d  t |  d d d  S(   Nu>   worker: Hitting Ctrl+C again will terminate all running tasks!R   u   SIGINT(   R'   R   (   R   (    (    s4   /tmp/pip-unpacked-wheel-gV1wwp/celery/apps/worker.pyt	   on_SIGINT4  s    
u   SIGINTR   c          O@ s   d  S(   N(    (   R   R   (    (    s4   /tmp/pip-unpacked-wheel-gV1wwp/celery/apps/worker.pyR   <  s    c           C@ sC   t  j t j t j t j g  t j t j t j g t j	  d  S(   N(
   R   t   close_open_fdsR$   t	   __stdin__RT   R%   R   t   execvt
   executableR   (    (    (    s4   /tmp/pip-unpacked-wheel-gV1wwp/celery/apps/worker.pyt   _reload_current_worker@  s    u   SIGHUPc         C@ s   d   } | t  j | <d  S(   Nc          W@ s_   t  t  t d j d j t j    d d l } | j t	  d d l
 m } t | _ d S(   u5   Signal handler restarting the current python program.u   Restarting celery worker ({0})u    i    N(   R   (   R   R   R'   R#   RO   R$   R   t   atexitt   registerR   R   R   t   should_stop(   R   R   R   (    (    s4   /tmp/pip-unpacked-wheel-gV1wwp/celery/apps/worker.pyt   restart_worker_sig_handlerI  s    
(   R   R   (   R   R   R   (    (    s4   /tmp/pip-unpacked-wheel-gV1wwp/celery/apps/worker.pyR   G  s    	u   SIGUSR1c         C@ s*   t  s t r d  Sd   } | t j |  <d  S(   Nc          W@ s!   t     t t    Wd QXd S(   u<   Signal handler logging the stacktrace of all active threads.N(   R   R'   R   (   R   (    (    s4   /tmp/pip-unpacked-wheel-gV1wwp/celery/apps/worker.pyt   cry_handlerY  s    
(   t	   is_jythont   is_pypyR   R   (   R   R   (    (    s4   /tmp/pip-unpacked-wheel-gV1wwp/celery/apps/worker.pyR   T  s    	u   CELERY_RDBSIGu   SIGUSR2c         C@ s/   d   } t  j j |   r+ | t j | <n  d  S(   Nc          W@ sP   t    A d d l m } m } |  r0 |  d n	 |   j } | |  Wd QXd S(   u=   Signal handler setting a rdb breakpoint at the current frame.i    (   t	   set_tracet   _framei   N(   R   t   celery.contrib.rdbR   R   t   f_back(   R   R   R   t   frame(    (    s4   /tmp/pip-unpacked-wheel-gV1wwp/celery/apps/worker.pyt   rdb_handlerc  s    
(   R   R   t   getR   R   (   t   envvarR   R   (    (    s4   /tmp/pip-unpacked-wheel-gV1wwp/celery/apps/worker.pyR   `  s    	c         @ s      f d   } | t  j   <d  S(   Nc         @ s*   t     t d j d     Wd  QXd  S(   NuH   {sig} not supported: Restarting with {sig} is unstable on this platform!R   (   R   R'   R#   (   t   signumR   (   R   (    s4   /tmp/pip-unpacked-wheel-gV1wwp/celery/apps/worker.pyt   warn_on_HUP_handlerp  s    
(   R   R   (   R   R   R   (    (   R   s4   /tmp/pip-unpacked-wheel-gV1wwp/celery/apps/worker.pyR   n  s    (H   t   __doc__t
   __future__R    R   R   Rg   R   Ro   R   R$   RK   t	   functoolsR   t   billiardR   t   kombu.utils.encodingR   t   celeryR   R   R   t
   celery.appR	   t   celery.exceptionsR
   R   R   t   celery.fiveR   R   t   celery.loaders.appR   t   celery.platformsR   t   celery.utilsR   R   t   celery.utils.importsR   t   celery.utils.logR   R   R   t   celery.utils.textR   R   R   t   __all__R   t   loggerR   R   t   hasattrR   RM   R    R'   R   R}   Rj   R(   RC   R   R   R   R   R   R   R   R   R   R   (    (    (    s4   /tmp/pip-unpacked-wheel-gV1wwp/celery/apps/worker.pyt   <module>   sz   							