B
    w2[*                 @   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	   1/root/Python-3.7.0/Lib/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)self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   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   partiesaction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)poolr/   r   )r   	processesinitializer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)sharedctypesr5   )r   typecode_or_typeargsr5   r	   r	   r
   r5   y   s    zBaseContext.RawValuec             C   s   ddl m} |||S )zReturns a shared arrayr   )RawArray)r6   r9   )r   r7   size_or_initializerr9   r	   r	   r
   r9   ~   s    zBaseContext.RawArray)r!   c            G   s&   ddl m} ||f|||  dS )z$Returns a synchronized shared objectr   )Value)r!   r   )r6   r;   r   )r   r7   r!   r8   r;   r	   r	   r
   r;      s    zBaseContext.Valuec            C   s    ddl m} |||||  dS )z#Returns a synchronized shared arrayr   )Array)r!   r   )r6   r<   r   )r   r7   r:   r!   r<   r	   r	   r
   r<      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spawnr?   )r   r?   r	   r	   r
   r?      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)utilrD   )r   rD   r	   r	   r
   rD      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)rE   rF   )r   levelrF   r	   r	   r
   rF      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)rC   rJ   )r   
executablerJ   r	   r	   r
   rJ      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)
forkserverrL   )r   Zmodule_namesrL   r	   r	   r
   rL      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)rP   )r   rR   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   )rX   )r   r   r	   r	   r
   rZ      s    c             C   s   d S )Nr	   )r   r	   r	   r
   rQ      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   current_processactive_childrenr   r   r   r   r   r    r"   r$   r%   r&   r*   r-   r.   r/   r5   r9   r;   r<   r?   rD   rF   rI   rJ   rL   r   rU   rW   propertyrZ   setterrQ   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   r`   _Popen)process_objr	   r	   r
   rb      s    zProcess._Popen)r   r   r   _start_methodr[   rb   r	   r	   r	   r
   r`      s   r`   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)ra   _actual_context)r   r0   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)rf   ra   superr   )r   rR   )	__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)rf   RuntimeErrorr   )r   rR   rV   r	   r	   r
   rW      s    zDefaultContext.set_start_methodc             C   s"   | j d kr|rd S | j| _ | j jS )N)rf   ra   rS   )r   rT   r	   r	   r
   rU      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 )Nr=   rC   forkrM   )r@   rA   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   r`   rg   r   rW   rU   rm   __classcell__r	   r	   )ri   r
   re      s   

re   c             C   s   g | ]}|d  dkr|qS )r   _r	   ).0xr	   r	   r
   
<listcomp>  s    rr   r=   c               @   s   e Zd ZdZedd ZdS )ForkProcessrk   c             C   s   ddl m} || S )Nr   )Popen)Z
popen_forkrt   )rc   rt   r	   r	   r
   rb     s    zForkProcess._PopenN)r   r   r   rd   r[   rb   r	   r	   r	   r
   rs     s   rs   c               @   s   e Zd ZdZedd ZdS )SpawnProcessrC   c             C   s   ddl m} || S )Nr   )rt   )Zpopen_spawn_posixrt   )rc   rt   r	   r	   r
   rb     s    zSpawnProcess._PopenN)r   r   r   rd   r[   rb   r	   r	   r	   r
   ru     s   ru   c               @   s   e Zd ZdZedd ZdS )ForkServerProcessrM   c             C   s   ddl m} || S )Nr   )rt   )Zpopen_forkserverrt   )rc   rt   r	   r	   r
   rb      s    zForkServerProcess._PopenN)r   r   r   rd   r[   rb   r	   r	   r	   r
   rv     s   rv   c               @   s   e Zd ZdZeZdS )ForkContextrk   N)r   r   r   rS   rs   r`   r	   r	   r	   r
   rw   %  s   rw   c               @   s   e Zd ZdZeZdS )SpawnContextrC   N)r   r   r   rS   ru   r`   r	   r	   r	   r
   rx   )  s   rx   c               @   s   e Zd ZdZeZdd ZdS )ForkServerContextrM   c             C   s   t jstdd S )Nz%forkserver start method not available)r   rl   rP   )r   r	   r	   r
   rQ   0  s    z"ForkServerContext._check_availableN)r   r   r   rS   rv   r`   rQ   r	   r	   r	   r
   ry   -  s   ry   )rk   rC   rM   rk   c               @   s   e Zd ZdZedd ZdS )ru   rC   c             C   s   ddl m} || S )Nr   )rt   )Zpopen_spawn_win32rt   )rc   rt   r	   r	   r
   rb   ?  s    zSpawnProcess._PopenN)r   r   r   rd   r[   rb   r	   r	   r	   r
   ru   =  s   c               @   s   e Zd ZdZeZdS )rx   rC   N)r   r   r   rS   ru   r`   r	   r	   r	   r
   rx   D  s   rC   c             C   s   t |  t_d S )N)rN   ra   rf   )rR   r	   r	   r
   _force_start_methodQ  s    rz   c               C   s   t tdd S )Nspawning_popen)rB   _tlsr	   r	   r	   r
   get_spawning_popenZ  s    r}   c             C   s
   | t _d S )N)r|   r{   )popenr	   r	   r
   set_spawning_popen]  s    r   c             C   s    t  d krtdt| j d S )NzF%s objects should only be shared between processes through inheritance)r}   rj   typer   )objr	   r	   r
   assert_spawning`  s    
r   )!r   r@   	threadingrH   r   r   __all__	Exceptionr   r   r   r   objectr   ZBaseProcessr`   re   dirrA   rs   ru   rv   rw   rx   ry   rN   ra   rz   localr|   r}   r   r   r	   r	   r	   r
   <module>   sD    >'

