B
    ^ c*                 @   s  d dl Z d dlZd dlZddlmZ ddlmZ g ZG dd deZG dd deZ	G d	d
 d
eZ
G dd deZG dd deZG dd dejZG dd deZdd eeD e_ejdkrLG dd dejZG dd dejZG dd dejZG dd deZG dd deZG d d! d!eZe e e d"Zeed# Zn8G d$d dejZG d%d deZd&e iZeed& Zd'd( Ze Zd)d* Zd+d, Zd-d. Z dS )/    N   )process)	reductionc               @   s   e Zd ZdS )ProcessErrorN)__name__
__module____qualname__ r	   r	   (lib/python3.7/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               @   sN  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dCddZdd	 Zd
d ZdDddZdEddZdFddZdd ZdGddZdHddZdIddZdd ZdJd d!Zd"d# Zd$d% Zdd&d'd(Zdd&d)d*Zd+d, Zd-d. ZdKd/d0Zd1d2 Z d3d4 Z!d5d6 Z"dLd7d8Z#dMd:d;Z$dNd<d=Z%e&d>d? Z'e'j(d@d? Z'dAdB Z)dS )OBaseContextc             C   s"   t  }|dkrtdn|S d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   s&   ddl m} ||  d}|  |S )zReturns 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
   Manager0   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S )z#Returns a non-recursive lock objectr   )Lock)r   )synchronizer   r   )r   r   r	   r	   r
   r   @   s    zBaseContext.Lockc             C   s   ddl m} ||  dS )zReturns a recursive lock objectr   )RLock)r   )r   r   r   )r   r   r	   r	   r
   r   E   s    zBaseContext.RLockNc             C   s   ddl m} |||  dS )zReturns a condition objectr   )	Condition)r   )r   r   r   )r   lockr   r	   r	   r
   r   J   s    zBaseContext.Conditionr   c             C   s   ddl m} |||  dS )zReturns a semaphore objectr   )	Semaphore)r   )r   r    r   )r   valuer    r	   r	   r
   r    O   s    zBaseContext.Semaphorec             C   s   ddl m} |||  dS )z"Returns a bounded semaphore objectr   )BoundedSemaphore)r   )r   r"   r   )r   r!   r"   r	   r	   r
   r"   T   s    zBaseContext.BoundedSemaphorec             C   s   ddl m} ||  dS )zReturns an event objectr   )Event)r   )r   r#   r   )r   r#   r	   r	   r
   r#   Y   s    zBaseContext.Eventc             C   s    ddl m} |||||  dS )zReturns a barrier objectr   )Barrier)r   )r   r$   r   )r   ZpartiesactionZtimeoutr$   r	   r	   r
   r$   ^   s    zBaseContext.Barrierr   c             C   s   ddl m} |||  dS )zReturns a queue objectr   )Queue)r   )queuesr&   r   )r   maxsizer&   r	   r	   r
   r&   c   s    zBaseContext.Queuec             C   s   ddl m} |||  dS )zReturns a queue objectr   )JoinableQueue)r   )r'   r)   r   )r   r(   r)   r	   r	   r
   r)   h   s    zBaseContext.JoinableQueuec             C   s   ddl m} ||  dS )zReturns a queue objectr   )SimpleQueue)r   )r'   r*   r   )r   r*   r	   r	   r
   r*   m   s    zBaseContext.SimpleQueuer	   c             C   s"   ddl m} ||||||  dS )zReturns a process pool objectr   )Pool)context)Zpoolr+   r   )r   Z	processesZinitializerZinitargsZmaxtasksperchildr+   r	   r	   r
   r+   r   s    
zBaseContext.Poolc             G   s   ddl m} ||f| S )zReturns a shared objectr   )RawValue)sharedctypesr-   )r   typecode_or_typeargsr-   r	   r	   r
   r-   y   s    zBaseContext.RawValuec             C   s   ddl m} |||S )zReturns a shared arrayr   )RawArray)r.   r1   )r   r/   size_or_initializerr1   r	   r	   r
   r1   ~   s    zBaseContext.RawArray)r   c            G   s&   ddl m} ||f|||  dS )z$Returns a synchronized shared objectr   )Value)r   r   )r.   r3   r   )r   r/   r   r0   r3   r	   r	   r
   r3      s    zBaseContext.Valuec            C   s    ddl m} |||||  dS )z#Returns a synchronized shared arrayr   )Array)r   r   )r.   r4   r   )r   r/   r2   r   r4   r	   r	   r
   r4      s    zBaseContext.Arrayc             C   s,   t jdkr(tt ddr(ddlm} |  dS )zCheck 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spawnr7   )r   r7   r	   r	   r
   r7      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 )zSets 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;   rB   )r   
executablerB   r	   r	   r
   rB      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)
forkserverrD   )r   Zmodule_namesrD   r	   r	   r
   rD      s    z"BaseContext.set_forkserver_preloadc             C   sH   |d kr| S yt | }W n" tk
r:   td| d Y nX |  |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)rH   )r   rJ   forcer	   r	   r
   set_start_method   s    zBaseContext.set_start_methodc             C   s   t  dS )z_Controls how objects will be reduced to a form that can be
        shared with other processes.r   )globalsget)r   r	   r	   r
   reducer   s    zBaseContext.reducerc             C   s   |t  d< d S )Nr   )rP   )r   r   r	   r	   r
   rR      s    c             C   s   d S )Nr	   )r   r	   r	   r
   rI      s    zBaseContext._check_available)T)N)r   )r   )NN)r   )r   )NNr	   N)N)N)F)F)*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-   r1   r3   r4   r7   r<   r>   rA   rB   rD   r   rM   rO   propertyrR   setterrI   r	   r	   r	   r
   r      sJ   








 





r   c               @   s   e Zd ZdZedd ZdS )ProcessNc             C   s   t  j| S )N)_default_contextr   rV   _Popen)process_objr	   r	   r
   rX      s    zProcess._Popen)r   r   r   _start_methodrS   rX   r	   r	   r	   r
   rV      s   rV   c                   sF   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  Z	S )DefaultContextc             C   s   || _ d | _d S )N)rW   _actual_context)r   r,   r	   r	   r
   __init__   s    zDefaultContext.__init__Nc                s0   |d kr | j d kr| j| _ | j S t |S d S )N)r\   rW   superr   )r   rJ   )	__class__r	   r
   r      s
    
zDefaultContext.get_contextFc             C   s<   | j d k	r|std|d kr,|r,d | _ d S | || _ d S )Nzcontext has already been set)r\   RuntimeErrorr   )r   rJ   rN   r	   r	   r
   rO      s    zDefaultContext.set_start_methodc             C   s"   | j d kr|rd S | j| _ | j jS )N)r\   rW   rK   )r   rL   r	   r	   r
   rM      s
    
zDefaultContext.get_start_methodc             C   s,   t jdkrdgS tjr dddgS ddgS d S )Nr5   r;   forkrE   )r8   r9   r   HAVE_SEND_HANDLE)r   r	   r	   r
   get_all_start_methods   s
    

z$DefaultContext.get_all_start_methods)N)F)F)
r   r   r   rV   r]   r   rO   rM   rc   __classcell__r	   r	   )r_   r
   r[      s   

r[   c             C   s   g | ]}|d  dkr|qS )r   _r	   ).0xr	   r	   r
   
<listcomp>  s    rh   r5   c               @   s   e Zd ZdZedd ZdS )ForkProcessra   c             C   s   ddl m} || S )Nr   )Popen)Z
popen_forkrj   )rY   rj   r	   r	   r
   rX     s    zForkProcess._PopenN)r   r   r   rZ   rS   rX   r	   r	   r	   r
   ri     s   ri   c               @   s   e Zd ZdZedd ZdS )SpawnProcessr;   c             C   s   ddl m} || S )Nr   )rj   )Zpopen_spawn_posixrj   )rY   rj   r	   r	   r
   rX     s    zSpawnProcess._PopenN)r   r   r   rZ   rS   rX   r	   r	   r	   r
   rk     s   rk   c               @   s   e Zd ZdZedd ZdS )ForkServerProcessrE   c             C   s   ddl m} || S )Nr   )rj   )Zpopen_forkserverrj   )rY   rj   r	   r	   r
   rX      s    zForkServerProcess._PopenN)r   r   r   rZ   rS   rX   r	   r	   r	   r
   rl     s   rl   c               @   s   e Zd ZdZeZdS )ForkContextra   N)r   r   r   rK   ri   rV   r	   r	   r	   r
   rm   %  s   rm   c               @   s   e Zd ZdZeZdS )SpawnContextr;   N)r   r   r   rK   rk   rV   r	   r	   r	   r
   rn   )  s   rn   c               @   s   e Zd ZdZeZdd ZdS )ForkServerContextrE   c             C   s   t jstdd S )Nz%forkserver start method not available)r   rb   rH   )r   r	   r	   r
   rI   0  s    z"ForkServerContext._check_availableN)r   r   r   rK   rl   rV   rI   r	   r	   r	   r
   ro   -  s   ro   )ra   r;   rE   ra   c               @   s   e Zd ZdZedd ZdS )rk   r;   c             C   s   ddl m} || S )Nr   )rj   )Zpopen_spawn_win32rj   )rY   rj   r	   r	   r
   rX   ?  s    zSpawnProcess._PopenN)r   r   r   rZ   rS   rX   r	   r	   r	   r
   rk   =  s   c               @   s   e Zd ZdZeZdS )rn   r;   N)r   r   r   rK   rk   rV   r	   r	   r	   r
   rn   D  s   r;   c             C   s   t |  t_d S )N)rF   rW   r\   )rJ   r	   r	   r
   _force_start_methodQ  s    rp   c               C   s   t tdd S )Nspawning_popen)r:   _tlsr	   r	   r	   r
   get_spawning_popenZ  s    rs   c             C   s
   | t _d S )N)rr   rq   )popenr	   r	   r
   set_spawning_popen]  s    ru   c             C   s    t  d krtdt| j d S )NzF%s objects should only be shared between processes through inheritance)rs   r`   typer   )objr	   r	   r
   assert_spawning`  s    
rx   )!r   r8   Z	threadingr@   r   r   __all__	Exceptionr   r   r   r   objectr   ZBaseProcessrV   r[   dirr9   ri   rk   rl   rm   rn   ro   rF   rW   rp   Zlocalrr   rs   ru   rx   r	   r	   r	   r
   <module>   sD    >'

