ó
ĶÕ\c           @` sŽ  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 m	 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 d	   Z e j e e j  e  d
   Z e
 j Z d   Z d e f d     YZ e   Z d   Z  y6 d  d l! Z" e" j# j$   d  d l% m& Z& d   Z' Wn# e( k
 rnd   Z' d   Z& n Xd   Z) d Z* d   Z+ d d d e- d d  Z. d   Z/ d S(   i    (   t   absolute_importt   divisiont   print_functionN(   t   warni   (   t   config(   t   copyreg(   t	   get_async(   t   fuset   cullc         C` s   t  |  j |  j f f S(   N(   t   getattrt   __objclass__t   __name__(   t   m(    (    s3   lib/python2.7/site-packages/dask/multiprocessing.pyt   _reduce_method_descriptor   s    c         C` s   t  j |  d t j S(   Nt   protocol(   t   cloudpicklet   dumpst   picklet   HIGHEST_PROTOCOL(   t   x(    (    s3   lib/python2.7/site-packages/dask/multiprocessing.pyt   _dumps   s    c           C` s   t  j   j S(   N(   t   multiprocessingt   current_processt   ident(    (    (    s3   lib/python2.7/site-packages/dask/multiprocessing.pyt   _process_get_id    s    t   RemoteExceptionc           B` s2   e  Z d  Z d   Z d   Z d   Z d   Z RS(   sY    Remote Exception

    Contains the exception and traceback from a remotely run task
    c         C` s   | |  _  | |  _ d  S(   N(   t	   exceptiont	   traceback(   t   selfR   R   (    (    s3   lib/python2.7/site-packages/dask/multiprocessing.pyt   __init__6   s    	c         C` s   t  |  j  d |  j S(   Ns   

Traceback
---------
(   t   strR   R   (   R   (    (    s3   lib/python2.7/site-packages/dask/multiprocessing.pyt   __str__:   s    c         C` s6   t  t t t |    t |  j  t |  j    S(   N(   t   sortedt   sett   dirt   typet   listt   __dict__R   (   R   (    (    s3   lib/python2.7/site-packages/dask/multiprocessing.pyt   __dir__@   s    c         C` s9   y t  j |  |  SWn t k
 r4 t |  j |  SXd  S(   N(   t   objectt   __getattribute__t   AttributeErrorR	   R   (   R   t   key(    (    s3   lib/python2.7/site-packages/dask/multiprocessing.pyt   __getattr__E   s    (   R   t
   __module__t   __doc__R   R   R&   R+   (    (    (    s3   lib/python2.7/site-packages/dask/multiprocessing.pyR   1   s
   			c         C` s   t  |   t k r/ t t  |   } | |  |  SyR t  |  j j t t  |   f i t  |   d 6 } | t t  |   <| |  |  SWn t k
 r |  SXd S(   s8    Metaclass that wraps exception type in RemoteException t   exception_typeN(   R#   t
   exceptionst	   __class__R   R   t	   TypeError(   t   exct   tbt   typ(    (    s3   lib/python2.7/site-packages/dask/multiprocessing.pyt   remote_exceptionO   s    (   t   reraisec         C` s   |  S(   N(    (   R3   (    (    s3   lib/python2.7/site-packages/dask/multiprocessing.pyt   _pack_tracebackd   s    c         C` s   d j  t j |    S(   Nt    (   t   joinR   t	   format_tb(   R3   (    (    s3   lib/python2.7/site-packages/dask/multiprocessing.pyR7   h   s    c         C` s   t  |  |  }  |   d  S(   N(   R5   (   R2   R3   (    (    s3   lib/python2.7/site-packages/dask/multiprocessing.pyR6   k   s    c         C` s   t  j   \ } } } t |  } y | |  | f  } WnF t k
 r }  t  j   \ } } } t |  } | |  | f  } n X| S(   N(   t   syst   exc_infoR7   t   BaseException(   t   eR   t   exc_typet	   exc_valuet   exc_tracebackR3   t   result(    (    s3   lib/python2.7/site-packages/dask/multiprocessing.pyt   pack_exceptionp   s    s   The 'multiprocessing.context' configuration option will be ignored on Python 2
and on Windows, because they each only support a single context.
c          C` sl   t  j d k s! t  j j d k rM t j d d  d k	 rI t t t	  n  t
 St j d d  }  t
 j |   S(   s,    Return the current multiprocessing context.t   win32i   s   multiprocessing.contextN(   R;   t   platformt   version_infot   majorR   t   gett   NoneR   t   _CONTEXT_UNSUPPORTEDt   UserWarningR   t   get_context(   t   context_name(    (    s3   lib/python2.7/site-packages/dask/multiprocessing.pyRL      s    !c         K` sB  | p t  j d d  } | p- t  j d d  } | d k rc t   } | j | d t } t }	 n t }	 t |  |  \ }
 } | r t	 |
 | |  \ } } n |
 } | pĀ t  j d d  pĀ t
 } | pÞ t  j d d  pÞ t } zF t | j t | j  | | d t d | d | d	 t d
 t | } Wd |	 r=| j   n  X| S(   s_   Multiprocessed get function appropriate for Bags

    Parameters
    ----------
    dsk : dict
        dask graph
    keys : object or list
        Desired results from graph
    num_workers : int
        Number of worker processes (defaults to number of cores)
    func_dumps : function
        Function to use for function serialization
        (defaults to cloudpickle.dumps)
    func_loads : function
        Function to use for function deserialization
        (defaults to cloudpickle.loads)
    optimize_graph : bool
        If True [default], `fuse` is applied to the graph before computation.
    t   poolt   num_workerst   initializert
   func_loadst
   func_dumpst   get_idR   t   loadsRC   t   raise_exceptionN(   R   RH   RI   RL   t   Poolt   initialize_worker_processt   Truet   FalseR   R   t   _loadsR   R   t   apply_asynct   lent   _poolR   RC   R6   t   close(   t   dskt   keysRO   RQ   RR   t   optimize_graphRN   t   kwargst   contextt   cleanupt   dsk2t   dependenciest   dsk3RT   R   RB   (    (    s3   lib/python2.7/site-packages/dask/multiprocessing.pyRH      s,    			c          C` s2   t  j j d  }  |  d k	 r. |  j j   n  d S(   sE   
    Initialize a worker process before running any tasks in it.
    t   numpyN(   R;   t   modulesRH   RI   t   randomt   seed(   t   np(    (    s3   lib/python2.7/site-packages/dask/multiprocessing.pyRW   Į   s    (0   t
   __future__R    R   R   R   R   R   R;   t   warningsR   R   R8   R   t   compatibilityR   t   localR   t   optimizationR   R   R   R#   R!   t   unionR   RT   RZ   R   t	   ExceptionR   t   dictR/   R5   t   tblib.pickling_supportt   tblibt   pickling_supportt   installt   dask.compatibilityR6   R7   t   ImportErrorRC   RJ   RL   RI   RX   RH   RW   (    (    (    s3   lib/python2.7/site-packages/dask/multiprocessing.pyt   <module>   s@   										9