î
]á[\­)  ã               @   s[  d  d l  Z  d  d l Z d  d l Z d d l m Z g  Z Gd d „  d e ƒ Z Gd d „  d e ƒ Z Gd d	 „  d	 e ƒ Z	 Gd
 d „  d e ƒ Z
 Gd d „  d e ƒ Z Gd d „  d e j ƒ Z Gd d „  d e ƒ Z e d d „  e e ƒ Dƒ ƒ e _ e j d k rÌGd d „  d e j ƒ Z Gd d „  d e j ƒ Z Gd d „  d e j ƒ Z Gd d „  d e ƒ Z Gd d „  d e ƒ Z Gd d  „  d  e ƒ Z i e ƒ  d! 6e ƒ  d" 6e ƒ  d# 6Z e e d! ƒ Z nO Gd$ d „  d e j ƒ Z Gd% d „  d e ƒ Z i e ƒ  d" 6Z e e d" ƒ Z d& d' „  Z e j ƒ  Z d( d) „  Z d* d+ „  Z d, d- „  Z  d S).é    Né   )Úprocessc               @   s   e  Z d  Z d S)ÚProcessErrorN)Ú__name__Ú
__module__Ú__qualname__© r   r   ú-/usr/lib/python3.4/multiprocessing/context.pyr      s   r   c               @   s   e  Z d  Z d S)ÚBufferTooShortN)r   r   r   r   r   r   r	   r
      s   r
   c               @   s   e  Z d  Z d S)ÚTimeoutErrorN)r   r   r   r   r   r   r	   r      s   r   c               @   s   e  Z d  Z d S)ÚAuthenticationErrorN)r   r   r   r   r   r   r	   r      s   r   c               @   sÒ  e  Z d  Z e Z e Z e Z e Z e e j	 ƒ Z	 e e j
 ƒ Z
 d d „  Z d d „  Z d d d „ Z d d	 „  Z d
 d „  Z d d d „ Z d d d „ Z d d d „ Z d d „  Z d d d d „ Z d d d „ Z d d d „ Z d d „  Z d d f  d d d  „ Z d! d" „  Z d# d$ „  Z d% d d& d' „ Z d% d d( d) „ Z d* d+ „  Z d, d- „  Z d d. d/ „ Z d0 d1 „  Z  d2 d3 „  Z! d4 d5 „  Z" d d6 d7 „ Z# d8 d9 d: „ Z$ d d; d< „ Z% d= d> „  Z& d S)?ÚBaseContextc             C   s/   t  j ƒ  } | d k r' t d ƒ ‚ n | Sd S)z(Returns the number of CPUs in the systemNzcannot determine number of cpus)ÚosÚ	cpu_countÚNotImplementedError)ÚselfZnumr   r   r	   r   '   s    zBaseContext.cpu_countc             C   s3   d d l  m } | d |  j ƒ  ƒ } | j ƒ  | S)z½Returns a manager associated with a running server process

        The managers methods such as `Lock()`, `Condition()` and `Queue()`
        can be used to create shared objects.
        r   )ÚSyncManagerÚctx)Zmanagersr   Úget_contextÚstart)r   r   Úmr   r   r	   ÚManager/   s    
zBaseContext.ManagerTc             C   s   d d l  m } | | ƒ S)z1Returns two connection object connected by a piper   )ÚPipe)Ú
connectionr   )r   Zduplexr   r   r   r	   r   :   s    zBaseContext.Pipec             C   s#   d d l  m } | d |  j ƒ  ƒ S)z#Returns a non-recursive lock objectr   )ÚLockr   )Úsynchronizer   r   )r   r   r   r   r	   r   ?   s    zBaseContext.Lockc             C   s#   d d l  m } | d |  j ƒ  ƒ S)zReturns a recursive lock objectr   )ÚRLockr   )r   r   r   )r   r   r   r   r	   r   D   s    zBaseContext.RLockNc             C   s&   d d l  m } | | d |  j ƒ  ƒS)zReturns a condition objectr   )Ú	Conditionr   )r   r   r   )r   Úlockr   r   r   r	   r   I   s    zBaseContext.Conditionr   c             C   s&   d d l  m } | | d |  j ƒ  ƒS)zReturns a semaphore objectr   )Ú	Semaphorer   )r   r   r   )r   Úvaluer   r   r   r	   r   N   s    zBaseContext.Semaphorec             C   s&   d d l  m } | | d |  j ƒ  ƒS)z"Returns a bounded semaphore objectr   )ÚBoundedSemaphorer   )r   r!   r   )r   r    r!   r   r   r	   r!   S   s    zBaseContext.BoundedSemaphorec             C   s#   d d l  m } | d |  j ƒ  ƒ S)zReturns an event objectr   )ÚEventr   )r   r"   r   )r   r"   r   r   r	   r"   X   s    zBaseContext.Eventc             C   s,   d d l  m } | | | | d |  j ƒ  ƒS)zReturns a barrier objectr   )ÚBarrierr   )r   r#   r   )r   ZpartiesÚactionZtimeoutr#   r   r   r	   r#   ]   s    zBaseContext.Barrierr   c             C   s&   d d l  m } | | d |  j ƒ  ƒS)zReturns a queue objectr   )ÚQueuer   )Úqueuesr%   r   )r   Úmaxsizer%   r   r   r	   r%   b   s    zBaseContext.Queuec             C   s&   d d l  m } | | d |  j ƒ  ƒS)zReturns a queue objectr   )ÚJoinableQueuer   )r&   r(   r   )r   r'   r(   r   r   r	   r(   g   s    zBaseContext.JoinableQueuec             C   s#   d d l  m } | d |  j ƒ  ƒ S)zReturns a queue objectr   )ÚSimpleQueuer   )r&   r)   r   )r   r)   r   r   r	   r)   l   s    zBaseContext.SimpleQueuec             C   s/   d d l  m } | | | | | d |  j ƒ  ƒS)zReturns a process pool objectr   )ÚPoolÚcontext)Zpoolr*   r   )r   Z	processesZinitializerZinitargsZmaxtasksperchildr*   r   r   r	   r*   q   s    zBaseContext.Poolc             G   s   d d l  m } | | | Œ S)zReturns a shared objectr   )ÚRawValue)Úsharedctypesr,   )r   Útypecode_or_typeÚargsr,   r   r   r	   r,   x   s    zBaseContext.RawValuec             C   s   d d l  m } | | | ƒ S)zReturns a shared arrayr   )ÚRawArray)r-   r0   )r   r.   Úsize_or_initializerr0   r   r   r	   r0   }   s    zBaseContext.RawArrayr   c            G   s/   d d l  m } | | d | d |  j ƒ  | ŒS)z$Returns a synchronized shared objectr   )ÚValuer   r   )r-   r2   r   )r   r.   r   r/   r2   r   r   r	   r2   ‚   s    zBaseContext.Valuec            C   s/   d d l  m } | | | d | d |  j ƒ  ƒS)z#Returns a synchronized shared arrayr   )ÚArrayr   r   )r-   r3   r   )r   r.   r1   r   r3   r   r   r	   r3   ˆ   s    zBaseContext.Arrayc             C   s?   t  j d k r; t t  d d ƒ r; d d l m } | ƒ  n  d S)z‹Check whether this is a fake forked process in a frozen executable.
        If so then run code specified by commandline and exit.
        Úwin32ÚfrozenFr   )Úfreeze_supportN)ÚsysÚplatformÚgetattrÚspawnr6   )r   r6   r   r   r	   r6   Ž   s    !zBaseContext.freeze_supportc             C   s   d d l  m } | ƒ  S)zZReturn package logger -- if it does not already exist then
        it is created.
        r   )Ú
get_logger)Úutilr;   )r   r;   r   r   r	   r;   –   s    zBaseContext.get_loggerc             C   s   d d l  m } | | ƒ S)z8Turn on logging and add a handler which prints to stderrr   )Úlog_to_stderr)r<   r=   )r   Úlevelr=   r   r   r	   r=      s    zBaseContext.log_to_stderrc             C   s   d d l  m } d S)zVInstall support for sending connections and sockets
        between processes
        r   )r   N)Ú r   )r   r   r   r   r	   Úallow_connection_pickling¢   s    z%BaseContext.allow_connection_picklingc             C   s   d d l  m } | | ƒ d S)zÌSets the path to a python.exe or pythonw.exe binary used to run
        child processes instead of sys.executable when using the 'spawn'
        start method.  Useful for people embedding Python.
        r   )Úset_executableN)r:   rA   )r   Ú
executablerA   r   r   r	   rA   ª   s    zBaseContext.set_executablec             C   s   d d l  m } | | ƒ d S)zkSet list of module names to try to load in forkserver process.
        This is really just a hint.
        r   )Úset_forkserver_preloadN)Ú
forkserverrC   )r   Zmodule_namesrC   r   r   r	   rC   ²   s    z"BaseContext.set_forkserver_preloadc             C   sQ   | d  k r |  Sy t  | } Wn" t k
 rB t d | ƒ ‚ Yn X| j ƒ  | S)Nzcannot find context for %r)Ú_concrete_contextsÚKeyErrorÚ
ValueErrorÚ_check_available)r   Úmethodr   r   r   r	   r   ¹   s    
zBaseContext.get_contextFc             C   s   |  j  S)N)Ú_name)r   Ú
allow_noner   r   r	   Úget_start_methodÃ   s    zBaseContext.get_start_methodc             C   s   t  d ƒ ‚ d  S)Nz+cannot set start method of concrete context)rG   )r   rI   r   r   r	   Úset_start_methodÆ   s    zBaseContext.set_start_methodc             C   s   d  S)Nr   )r   r   r   r	   rH   É   s    zBaseContext._check_available)'r   r   r   r   r
   r   r   Ústaticmethodr   Zcurrent_processZactive_childrenr   r   r   r   r   r   r   r!   r"   r#   r%   r(   r)   r*   r,   r0   r2   r3   r6   r;   r=   r@   rA   rC   r   rL   rM   rH   r   r   r   r	   r      sF   	
r   c               @   s(   e  Z d  Z d Z e d d „  ƒ Z d S)ÚProcessNc             C   s   t  j ƒ  j j |  ƒ S)N)Ú_default_contextr   rO   Ú_Popen)Úprocess_objr   r   r	   rQ   Ò   s    zProcess._Popen)r   r   r   Ú_start_methodrN   rQ   r   r   r   r	   rO   Ð   s   rO   c                   sa   e  Z d  Z e Z d d „  Z d ‡  f d d † Z d d d „ Z d d	 d
 „ Z d d „  Z ‡  S)ÚDefaultContextc             C   s   | |  _  d  |  _ d  S)N)rP   Ú_actual_context)r   r+   r   r   r	   Ú__init__Ù   s    	zDefaultContext.__init__Nc                sE   | d  k r1 |  j  d  k r* |  j |  _  n  |  j  St ƒ  j | ƒ Sd  S)N)rU   rP   Úsuperr   )r   rI   )Ú	__class__r   r	   r   Ý   s
    zDefaultContext.get_contextFc             C   sZ   |  j  d  k	 r% | r% t d ƒ ‚ n  | d  k rD | rD d  |  _  d  S|  j | ƒ |  _  d  S)Nzcontext has already been set)rU   ÚRuntimeErrorr   )r   rI   Zforcer   r   r	   rM   å   s    	zDefaultContext.set_start_methodc             C   s2   |  j  d  k r( | r d  S|  j |  _  n  |  j  j S)N)rU   rP   rJ   )r   rK   r   r   r	   rL   í   s
    zDefaultContext.get_start_methodc             C   sJ   t  j d k r d g Sd d l m } | j r< d d d g Sd d g Sd  S)Nr4   r:   r   )Ú	reductionÚforkrD   )r7   r8   r?   rZ   ÚHAVE_SEND_HANDLE)r   rZ   r   r   r	   Úget_all_start_methodsô   s    	z$DefaultContext.get_all_start_methods)	r   r   r   rO   rV   r   rM   rL   r]   r   r   )rX   r	   rT   Ö   s   rT   c             c   s%   |  ] } | d  d k r | Vq d S)r   Ú_Nr   )Ú.0Úxr   r   r	   ú	<genexpr>þ   s    ra   r4   c               @   s(   e  Z d  Z d Z e d d „  ƒ Z d S)ÚForkProcessr[   c             C   s   d d l  m } | |  ƒ S)Nr   )ÚPopen)Z
popen_forkrc   )rR   rc   r   r   r	   rQ     s    zForkProcess._PopenN)r   r   r   rS   rN   rQ   r   r   r   r	   rb     s   rb   c               @   s(   e  Z d  Z d Z e d d „  ƒ Z d S)ÚSpawnProcessr:   c             C   s   d d l  m } | |  ƒ S)Nr   )rc   )Zpopen_spawn_posixrc   )rR   rc   r   r   r	   rQ     s    zSpawnProcess._PopenN)r   r   r   rS   rN   rQ   r   r   r   r	   rd     s   rd   c               @   s(   e  Z d  Z d Z e d d „  ƒ Z d S)ÚForkServerProcessrD   c             C   s   d d l  m } | |  ƒ S)Nr   )rc   )Zpopen_forkserverrc   )rR   rc   r   r   r	   rQ     s    zForkServerProcess._PopenN)r   r   r   rS   rN   rQ   r   r   r   r	   re     s   re   c               @   s   e  Z d  Z d Z e Z d S)ÚForkContextr[   N)r   r   r   rJ   rb   rO   r   r   r   r	   rf     s   rf   c               @   s   e  Z d  Z d Z e Z d S)ÚSpawnContextr:   N)r   r   r   rJ   rd   rO   r   r   r   r	   rg     s   rg   c               @   s(   e  Z d  Z d Z e Z d d „  Z d S)ÚForkServerContextrD   c             C   s,   d d l  m } | j s( t d ƒ ‚ n  d  S)Nr   )rZ   z%forkserver start method not available)r?   rZ   r\   rG   )r   rZ   r   r   r	   rH   &  s    	z"ForkServerContext._check_availableN)r   r   r   rJ   re   rO   rH   r   r   r   r	   rh   #  s   rh   r[   r:   rD   c               @   s(   e  Z d  Z d Z e d d „  ƒ Z d S)rd   r:   c             C   s   d d l  m } | |  ƒ S)Nr   )rc   )Zpopen_spawn_win32rc   )rR   rc   r   r   r	   rQ   6  s    zSpawnProcess._PopenN)r   r   r   rS   rN   rQ   r   r   r   r	   rd   4  s   c               @   s   e  Z d  Z d Z e Z d S)rg   r:   N)r   r   r   rJ   rd   rO   r   r   r   r	   rg   ;  s   c             C   s   t  |  t _ d  S)N)rE   rP   rU   )rI   r   r   r	   Ú_force_start_methodH  s    ri   c               C   s   t  t d d  ƒ S)NÚspawning_popen)r9   Ú_tlsr   r   r   r	   Úget_spawning_popenQ  s    rl   c             C   s   |  t  _ d  S)N)rk   rj   )Úpopenr   r   r	   Úset_spawning_popenT  s    rn   c             C   s/   t  ƒ  d  k r+ t d t |  ƒ j ƒ ‚ n  d  S)NzF%s objects should only be shared between processes through inheritance)rl   rY   Útyper   )Úobjr   r   r	   Úassert_spawningW  s    rq   )!r   r7   Z	threadingr?   r   Ú__all__Ú	Exceptionr   r
   r   r   Úobjectr   ZBaseProcessrO   rT   ÚlistÚdirr8   rb   rd   re   rf   rg   rh   rE   rP   ri   Zlocalrk   rl   rn   rq   r   r   r   r	   Ú<module>   sD   ³("

