ó
öÀ„\c           @@  s5  d  Z  d d l m Z d d l Z d d l Z d d l Z d d l m Z d d l m	 Z	 y d d l
 Z
 Wn e k
 rƒ d Z
 n Xd d l m Z d d l m Z e rÕ d d l m Z m Z m Z m Z m Z n  e j e ƒ Z e
 oö e j d	 k Z d
 e f d „  ƒ  YZ d e f d „  ƒ  YZ d d „ Z  d S(   sÇ   
    sphinx.util.parallel
    ~~~~~~~~~~~~~~~~~~~~

    Parallel building utilities.

    :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS.
    :license: BSD, see LICENSE for details.
i    (   t   absolute_importN(   t   sqrt(   t	   iteritems(   t   SphinxParallelError(   t   logging(   t   Anyt   Callablet   Dictt   Listt   Sequencet   posixt   SerialTasksc           B@  s2   e  Z d  Z d d „ Z d d d „ Z d „  Z RS(   sE   Has the same interface as ParallelTasks, but executes tasks directly.i   c         C@  s   d  S(   N(    (   t   selft   nproc(    (    s3   lib/python2.7/site-packages/sphinx/util/parallel.pyt   __init__*   s    c         C@  s;   | d  k	 r | | ƒ } n	 | ƒ  } | r7 | | ƒ n  d  S(   N(   t   None(   R   t	   task_funct   argt   result_funct   res(    (    s3   lib/python2.7/site-packages/sphinx/util/parallel.pyt   add_task.   s
    	c         C@  s   d  S(   N(    (   R   (    (    s3   lib/python2.7/site-packages/sphinx/util/parallel.pyt   join7   s    N(   t   __name__t
   __module__t   __doc__R   R   R   R   (    (    (    s3   lib/python2.7/site-packages/sphinx/util/parallel.pyR   '   s   	t   ParallelTasksc           B@  sA   e  Z d  Z d „  Z d „  Z d d d „ Z d „  Z d „  Z RS(   s1   Executes *nproc* tasks in parallel after forking.c         C@  sL   | |  _  i  |  _ i  |  _ i  |  _ i  |  _ i  |  _ d |  _ d |  _ d  S(   Ni    (   R   t   _result_funcst   _argst   _procst   _precvst   _precvsWaitingt	   _pworkingt   _taskid(   R   R   (    (    s3   lib/python2.7/site-packages/sphinx/util/parallel.pyR   ?   s    							c   	      C@  sÇ   yM t  j ƒ  } | j ƒ  ) | d  k r4 | ƒ  } n | | ƒ } Wd  QXt } WnJ t k
 r™ } t } t j | j	 | ƒ d j
 ƒ  } | t j ƒ  f } n Xt  j | j ƒ | j | | j | f ƒ d  S(   Ni    (   R   t   LogCollectort   collectR   t   Falset   BaseExceptiont   Truet	   tracebackt   format_exception_onlyt	   __class__t   stript
   format_exct   convert_serializablet   logst   send(	   R   t   pipet   funcR   t	   collectort   rett   failedt   errt   errmsg(    (    s3   lib/python2.7/site-packages/sphinx/util/parallel.pyt   _processQ   s    
c         C@  sœ   |  j  } |  j  d 7_  | p$ d „  |  j | <| |  j | <t j t ƒ \ } } t j d |  j d | | | f ƒ } | |  j | <| |  j	 | <|  j
 ƒ  d  S(   Ni   c         S@  s   d  S(   N(   R   (   R   t   result(    (    s3   lib/python2.7/site-packages/sphinx/util/parallel.pyt   <lambda>f   s    t   targett   args(   R    R   R   t   multiprocessingt   PipeR#   t   ProcessR5   R   R   t	   _join_one(   R   R   R   R   t   tidt   precvt   psendt   proc(    (    s3   lib/python2.7/site-packages/sphinx/util/parallel.pyR   b   s    	c         C@  s   x |  j  r |  j ƒ  q Wd  S(   N(   R   R=   (   R   (    (    s3   lib/python2.7/site-packages/sphinx/util/parallel.pyR   o   s    c   	      C@  sB  x× t  |  j ƒ D]¹ \ } } | j ƒ  r | j ƒ  \ } } } | rR t | Œ  ‚ n  x | D] } t j | ƒ qY W|  j j | ƒ |  j	 j | ƒ | ƒ |  j
 | j ƒ  |  j j | ƒ |  j d 8_ Pq q Wt j d ƒ xa |  j r=|  j |  j k  r=|  j j ƒ  \ } } | |  j | <|  j
 | j ƒ  |  j d 7_ qÝ Wd  S(   Ni   g{®Gáz”?(   R   R   t   pollt   recvR   t   loggert   handleR   t   popR   R   R   R   t   timet   sleepR   R   t   popitemt   start(	   R   R>   R.   t   excR,   R6   t   logt   newtidt   newprecv(    (    s3   lib/python2.7/site-packages/sphinx/util/parallel.pyR=   t   s$    %N(	   R   R   R   R   R5   R   R   R   R=   (    (    (    s3   lib/python2.7/site-packages/sphinx/util/parallel.pyR   <   s   			i
   c         C@  s¬   t  |  ƒ } | | } | | k r? t t | | | ƒ ƒ } n  | d k rT d } n  t | | ƒ \ } } | r| | d 7} n  g  t | ƒ D] } |  | | | d | !^ q‰ S(   Ni    i   (   t   lent   intR   t   divmodt   range(   t	   argumentsR   t   maxbatcht   nargst	   chunksizet   nchunkst   restt   i(    (    s3   lib/python2.7/site-packages/sphinx/util/parallel.pyt   make_chunks‹   s    
	(!   R   t
   __future__R    t   osRG   R&   t   mathR   t   sixR   R:   t   ImportErrorR   t   sphinx.errorsR   t   sphinx.utilR   R#   t   typingR   R   R   R   R	   t	   getLoggerR   RD   t   namet   parallel_availablet   objectR   R   RZ   (    (    (    s3   lib/python2.7/site-packages/sphinx/util/parallel.pyt   <module>
   s&   
+O