ó
ßüÚ\c           @` sA  d  d l  m Z m Z m Z d  d l 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 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 „  Z d „  Z d  d „ Z d „  Z d „  Z  d „  Z! e e ƒ  d „  ƒ ƒ Z" e ƒ  d „  ƒ Z# e j$ j% e j& d k d d ƒe ƒ  d „  ƒ ƒ Z' e ƒ  d „  ƒ Z( e ƒ  d „  ƒ Z) e ƒ  d „  ƒ Z* e ƒ  d „  ƒ Z+ e j$ j% e	 j, j- d ƒ d d ƒe ƒ  d „  ƒ ƒ Z. e ƒ  d „  ƒ Z/ d „  Z0 d  „  Z1 d! „  Z2 d S("   i    (   t   print_functiont   divisiont   absolute_import(   t	   timedeltaN(   t   sleep(   t   gen(   t   Event(   t   time(   t   AsyncProcess(   t
   mp_context(   t   gen_testt   pristine_loopt   nodebugc         C` s#   |  j  d d ƒ } | j | ƒ d  S(   Nt   timeouti   (   t   gett   put(   t   in_qt   out_qt   obj(    (    sB   lib/python2.7/site-packages/distributed/tests/test_asyncprocess.pyt   feed   s    c         C` s   t  j |  j ƒ  ƒ d  S(   N(   t   syst   exitR   (   t   q(    (    sB   lib/python2.7/site-packages/distributed/tests/test_asyncprocess.pyR      s    c         C` s   t  j |  ƒ d  S(   N(   R   R   (   t   rc(    (    sB   lib/python2.7/site-packages/distributed/tests/test_asyncprocess.pyt   exit_now   s    c         C` sG   t  j  t  j t  j ƒ x* t rB t j t j ƒ  |  ƒ t d ƒ q Wd  S(   Ng{®Gáz„?(   t   signalt   SIGINTt   SIG_DFLt   Truet   ost   killt   getpidR   (   t   signum(    (    sB   lib/python2.7/site-packages/distributed/tests/test_asyncprocess.pyt   exit_with_signal#   s    	c           C` s   x t  r t d ƒ q Wd  S(   Ng{®Gáz„?(   R   R   (    (    (    sB   lib/python2.7/site-packages/distributed/tests/test_asyncprocess.pyt   wait*   s    	c         C` s3   |  j  t t j ƒ  ƒ ƒ |  j  t j ƒ  j ƒ d  S(   N(   R   t   lent	   threadingt	   enumeratet   current_threadt   name(   R   (    (    sB   lib/python2.7/site-packages/distributed/tests/test_asyncprocess.pyt   threads_info/   s    c       	   c` s)  t  j ƒ  }  t  j ƒ  } t d t d |  | f ƒ } | j ƒ  sF t ‚ | j d  k s[ t ‚ | j d  k sp t ‚ | j	 s€ t ‚ t
 | _	 | j	 s˜ t ‚ t j | ƒ } t j | j ƒ } t j t ƒ  | j ƒ  VWd  QX| j ƒ  V| j ƒ  s÷ t ‚ | j d  k	 st ‚ | j d  k s!t ‚ t ƒ  } | j d d ƒ Vt ƒ  | } d | k o_d k n sjt ‚ | j ƒ  s|t ‚ | j d  k	 s‘t ‚ | j d  k s¦t ‚ t j t ƒ  t | _	 Wd  QX|  j d ƒ | j ƒ  d k sêt ‚ t ƒ  } | j d d ƒ Vt ƒ  | } | d	 k s#t ‚ | j ƒ  s6t ‚ | j d  k	 sKt ‚ | j d
 k s`t ‚ t ƒ  } | j ƒ  Vt ƒ  | } | d k s“t ‚ ~ t j ƒ  t ƒ  } x: | ƒ  d  k	 råt ƒ  | d k  råt d ƒ t j ƒ  q¬W| ƒ  d  k	 rÏd
 d l m } | ƒ  }	 |	 d  k	 r¿t j |	 ƒ }
 t j |	 ƒ } ~	 t d |
 | ƒ g  | D] } t | | ƒ rR| ^ qR} xI t  | ƒ D]8 \ } } t d | | j! j" | j! j# t$ | j% ƒ ƒ q€Wn  t j& d ƒ n  t ƒ  } xJ | ƒ  d  k	 r$t' j d ƒ Vt j ƒ  t ƒ  | } | d k  sÛt ‚ qÛWd  S(   Nt   targett   argsR   g{®Gáz”?gš™™™™™É?g{®Gáz„?i   i
   g      ð?i    g333333ã?i   gü©ñÒMbP?(   t	   FrameTypes   refs to proc:s   frames #%d:s'   AsyncProcess should have been destroyedg       @((   R	   t   QueueR   R   t   is_alivet   AssertionErrort   pidt   Nonet   exitcodet   daemonR   t   weakreft   reft   _processt   pytestt   raisest   joint   startR   t   FalseR   R   t   gct   collectR   t   typesR+   R   t   getrefcountt   get_referrerst   printt
   isinstanceR%   t   f_codet   co_namet   co_filenamet   sortedt   f_localst   failR   (   t   to_childt
   from_childt   proct   wr1t   wr2t   t1t   dtR9   R+   t   pR   t   refst   rt   framest   it   f(    (    sB   lib/python2.7/site-packages/distributed/tests/test_asyncprocess.pyt   test_simple4   s†    		"		
	%
	(			
c          c` sÕ   t  j ƒ  }  t d t d i |  d 6ƒ } t | _ | j ƒ  sD t ‚ | j d  k sY t ‚ | j
 ƒ  V| j ƒ  sv t ‚ | j d  k s‹ t ‚ |  j d ƒ | j d d ƒ V| j ƒ  s¼ t ‚ | j d k sÑ t ‚ d  S(   NR)   t   kwargsR   i   R   g      @(   R	   R,   R   R   R   R2   R-   R.   R1   R0   R9   R   R8   (   R   RJ   (    (    sB   lib/python2.7/site-packages/distributed/tests/test_asyncprocess.pyt   test_exitcode   s    	t   ntt   reasons
   POSIX onlyc          c` s  t  d t d t j f ƒ }  t |  _ |  j ƒ  s7 t ‚ |  j d  k sL t ‚ |  j
 ƒ  V|  j d d ƒ V|  j ƒ  s{ t ‚ |  j t j d f k sš t ‚ t  d t ƒ }  |  j
 ƒ  Vt j |  j t j ƒ |  j d d ƒ V|  j ƒ  sî t ‚ |  j t j d f k st ‚ d  S(   NR)   R*   R   g      @iÿ   (   R   R!   R   R   R   R2   R-   R.   R1   R0   R9   R8   R"   R   R   R/   t   SIGTERM(   RJ   (    (    sB   lib/python2.7/site-packages/distributed/tests/test_asyncprocess.pyt   test_signal¢   s    	c          c` su   t  d t ƒ }  t |  _ |  j ƒ  V|  j ƒ  V|  j d d ƒ V|  j ƒ  sR t ‚ |  j	 t
 j d f k sq t ‚ d  S(   NR)   R   g      @iÿ   (   R   R"   R   R2   R9   t	   terminateR8   R-   R.   R1   R   RZ   (   RJ   (    (    sB   lib/python2.7/site-packages/distributed/tests/test_asyncprocess.pyt   test_terminateº   s    	c          c` sÝ   t  d t ƒ }  |  j ƒ  t j t ƒ  |  j ƒ  VWd  QXt  d t ƒ }  |  j ƒ  V|  j ƒ  t j t ƒ  |  j ƒ  VWd  QXt  d t ƒ }  |  j ƒ  V|  j ƒ  V|  j ƒ  t j t ƒ  |  j ƒ  VWd  QX|  j ƒ  d  S(   NR)   (	   R   R   t   closeR6   R7   t
   ValueErrorR9   R\   R8   (   RJ   (    (    sB   lib/python2.7/site-packages/distributed/tests/test_asyncprocess.pyt
   test_closeÆ   s     


c          #` s£  t  j ƒ  }  t  j ƒ  } t ƒ  ‰  t j ‡  ‡ f d †  ƒ } t d t d |  | f ƒ ‰ ˆ  j ƒ  ˆ j | ƒ t	 ˆ _
 ˆ j ƒ  Vt j d ƒ Vˆ j ƒ  s¢ t ‚ ˆ  j ƒ  sµ t ‚ |  j d  ƒ ˆ  j t d d ƒ ƒ Vˆ  j ƒ  së t ‚ ˆ j ƒ  sþ t ‚ t d t ƒ ‰ ˆ  j ƒ  ˆ j | ƒ t	 ˆ _
 ˆ j ƒ  Vt j d ƒ Vˆ j ƒ  sXt ‚ ˆ  j ƒ  skt ‚ ˆ j ƒ  Vˆ  j t d d ƒ ƒ Vˆ  j ƒ  sŸt ‚ d  S(   Nc         3` s(   |  ˆ k s t  ‚ t j Vˆ  j ƒ  d  S(   N(   R.   R   t   momentt   set(   t   _proc(   t   evtRJ   (    sB   lib/python2.7/site-packages/distributed/tests/test_asyncprocess.pyt   on_stopâ   s    R)   R*   gš™™™™™©?t   secondsi   (   R	   R,   R   R   t	   coroutineR   R   t   cleart   set_exit_callbackR   R2   R9   R   R-   R.   t   is_setR   R0   R"   R   R\   (   RH   RI   Re   (    (   Rd   RJ   sB   lib/python2.7/site-packages/distributed/tests/test_asyncprocess.pyt   test_exit_callbackÜ   s6    	
	
	c          c` sž   t  j ƒ  }  t d t d |  f ƒ } | j ƒ  V| j ƒ  V|  j ƒ  } |  j ƒ  } | d k sd t ‚ | d k sv t ‚ |  j ƒ  |  j	 j ƒ  |  j
 j ƒ  d S(   sE   
    The main thread in the child should be called "MainThread".
    R)   R*   i   t
   MainThreadN(   R	   R,   R   R(   R9   R8   R   R.   R^   t   _readert   _writer(   R   RJ   t	   n_threadst	   main_name(    (    sB   lib/python2.7/site-packages/distributed/tests/test_asyncprocess.pyt   test_child_main_thread  s    
t   wins    num_fds not supported on windowsc          c` s  t  j d ƒ }  t d t ƒ } t | _ | j ƒ  V| j ƒ  V|  j ƒ  } | j	 ƒ  } t d t ƒ } t | _ | j ƒ  V| j ƒ  V| j
 ƒ  s– t ‚ | j d k s« t ‚ t ƒ  } xS | j	 ƒ  | k r	t j d ƒ Vt d | | j	 ƒ  ƒ t ƒ  | d k  s· t ‚ q· Wd  S(   Nt   psutilR)   i    gš™™™™™¹?s   fds:i
   (   R6   t   importorskipR   R   R   R2   R9   R8   t   Processt   num_fdsR-   R.   R1   R   R   R   R@   (   Rs   RJ   RO   t   beforeR9   (    (    sB   lib/python2.7/site-packages/distributed/tests/test_asyncprocess.pyt   test_num_fds  s$    			c          c` s=   t  d t d d ƒ }  |  j ƒ  Vt j d ƒ V|  j ƒ  Vd  S(   NR)   R*   i    gš™™™™™¹?(   i    (   R   R   R9   R   R\   (   RJ   (    (    sB   lib/python2.7/site-packages/distributed/tests/test_asyncprocess.pyt   test_terminate_after_stop8  s    c         C` s+   |  j  ƒ  d } t | ƒ | j d ƒ d  S(   Ng      @s   child should have exited by now(   Rb   R   t   send(   t   worker_readyt
   child_pipet   shorter_timeout(    (    sB   lib/python2.7/site-packages/distributed/tests/test_asyncprocess.pyt   _worker_process@  s    	

c      	   ` s_   ‡  f d †  } t  ƒ  A } z  | j t j | ƒ d d ƒWd | j ƒ  t d ƒ ‚ XWd QXd S(   s¶    Simulate starting an AsyncProcess and then dying.

    The child_alive pipe is held open for as long as the child is alive, and can
    be used to determine if it exited correctly. c          3` sM   t  j ƒ  }  t d t d |  ˆ  f ƒ } | j ƒ  V|  j ƒ  t j d ƒ d  S(   NR)   R*   iÿ   (   R	   R   R   R~   R9   R"   R   t   _exit(   R{   t   worker(   R|   (    sB   lib/python2.7/site-packages/distributed/tests/test_asyncprocess.pyt   parent_process_coroutineZ  s
    
R   i
   Ns*   this should be unreachable due to os._exit(   R   t   run_syncR   Rg   t   stopt   RuntimeError(   R|   R   t   loop(    (   R|   sB   lib/python2.7/site-packages/distributed/tests/test_asyncprocess.pyt   _parent_processT  s     
c          C` s+  t  j d t ƒ \ }  } zt  j d t d | f ƒ } | j ƒ  | j ƒ  | j ƒ  d } y |  j | ƒ } Wn5 t	 k
 r¤ t
 j j d ƒ s› t d ƒ ‚ t } n X| s± t ‚ y |  j ƒ  } Wn? t k
 rÔ nD t	 k
 rt
 j j d ƒ st d ƒ ‚ n Xt d j | ƒ ƒ ‚ Wd |  j ƒ  Xd S(	   sI   Check that a child process started by AsyncProcess exits if its parent
    exits.

    The motivation is to ensure that if an AsyncProcess is created and the
    creator process dies unexpectedly (e.g, via Out-of-memory SIGKILL), the
    child process and resources held by it should not be leaked.

    The child should monitor its parent and exit promptly if the parent exits.

    [test process] -> [parent using AsyncProcess (dies)] -> [worker process]
                 \                                          /
                  \________ <--   child_pipe   <-- ________/
    t   duplexR)   R*   g      @Rr   s   should only raise on windowss   unreachable: {}N(   R	   t   PipeR:   Ru   R†   R9   R^   R8   t   pollt   EnvironmentErrorR   t   platformt
   startswithR.   R   t   recvt   EOFErrorR„   t   format(   t   children_aliveR|   t   parentt   short_timeoutt   readablet   result(    (    sB   lib/python2.7/site-packages/distributed/tests/test_asyncprocess.pyt/   test_asyncprocess_child_teardown_on_parent_exitr  s*    



"(3   t
   __future__R    R   R   t   datetimeR   R;   R   R   R   R$   R   R   R3   R6   t   tornadoR   t   tornado.locksR   t   distributed.metricst   distributed.processR   t   distributed.utilsR	   t   distributed.utils_testR
   R   R   R   R   R   R!   R"   R(   RU   RW   t   markt   skipifR'   R[   R]   R`   Rk   Rq   R‹   RŒ   Rx   Ry   R~   R†   R•   (    (    (    sB   lib/python2.7/site-packages/distributed/tests/test_asyncprocess.pyt   <module>   sJ   					Z,			