B
    Ü/`4)  ã               @   s  d ddgZ ddlZddlZddlZddlZddlZddlmZ yej 	e 
¡ ¡ZW n ek
rj   dZY nX dd„ Zdd„ Zdd	„ ZG d
d „ d eƒZG dd„ deƒZG dd„ deƒZeƒ ae d¡aeƒ a[i Zx<eej ¡ ƒD ]*\ZZedd… dkràdekràeee < qàW eƒ Z dS )ÚBaseProcessÚcurrent_processÚactive_childrené    N)ÚWeakSetc               C   s   t S )z@
    Return process object representing the current process
    )Ú_current_process© r   r   ú-/usr/lib/python3.7/multiprocessing/process.pyr   $   s    c               C   s   t ƒ  ttƒS )zN
    Return list of process objects corresponding to live child processes
    )Ú_cleanupÚlistÚ	_childrenr   r   r   r   r   *   s    c              C   s.   x(t tƒD ]} | j ¡ d k	r
t | ¡ q
W d S )N)r
   r   Ú_popenÚpollÚdiscard)Úpr   r   r   r	   5   s    r	   c               @   sú   e Zd ZdZdd„ Zddddi fddœdd„Zd	d
„ Zdd„ Zdd„ Zdd„ Z	dd„ Z
d,dd„Zdd„ Zdd„ Zedd„ ƒZejdd„ ƒZedd„ ƒZejdd„ ƒZedd „ ƒZejd!d „ ƒZed"d#„ ƒZed$d%„ ƒZeZed&d'„ ƒZd(d)„ Zd*d+„ ZdS )-r   z€
    Process objects represent activity that is run in a separate process

    The class is analogous to `threading.Thread`
    c             C   s   t ‚d S )N)ÚNotImplementedError)Úselfr   r   r   Ú_PopenE   s    zBaseProcess._PopenNr   )Údaemonc            C   s¨   |d kst dƒ‚ttƒ}tj|f | _tj ¡ | _t ¡ | _	d | _
d| _|| _t|ƒ| _t|ƒ| _|pˆt| ƒjd d dd„ | jD ƒ¡ | _|d k	rš|| _t | ¡ d S )Nz#group argument must be None for nowFú-ú:c             s   s   | ]}t |ƒV  qd S )N)Ústr)Ú.0Úir   r   r   ú	<genexpr>U   s    z'BaseProcess.__init__.<locals>.<genexpr>)ÚAssertionErrorÚnextÚ_process_counterr   Ú	_identityÚ_configÚcopyÚosÚgetpidÚ_parent_pidr   Ú_closedÚ_targetÚtupleÚ_argsÚdictÚ_kwargsÚtypeÚ__name__ÚjoinÚ_namer   Ú	_danglingÚadd)r   ÚgroupÚtargetÚnameÚargsÚkwargsr   Úcountr   r   r   Ú__init__H   s    


zBaseProcess.__init__c             C   s   | j rtdƒ‚d S )Nzprocess object is closed)r#   Ú
ValueError)r   r   r   r   Ú_check_closedZ   s    zBaseProcess._check_closedc             C   s   | j r| j | j| jŽ dS )zQ
        Method to be run in sub-process; can be overridden in sub-class
        N)r$   r&   r(   )r   r   r   r   Úrun^   s    zBaseProcess.runc             C   sz   |   ¡  | jdkstdƒ‚| jt ¡ ks0tdƒ‚tj d¡rDtdƒ‚t	ƒ  |  
| ¡| _| jj| _| `| `| `t | ¡ dS )z%
        Start child process
        Nzcannot start a process twicez:can only start a process object created by current processr   z3daemonic processes are not allowed to have children)r7   r   r   r"   r    r!   r   r   Úgetr	   r   ÚsentinelÚ	_sentinelr$   r&   r(   r   r.   )r   r   r   r   Ústarte   s    
zBaseProcess.startc             C   s   |   ¡  | j ¡  dS )zT
        Terminate process; sends SIGTERM signal or uses TerminateProcess()
        N)r7   r   Ú	terminate)r   r   r   r   r=   w   s    zBaseProcess.terminatec             C   s   |   ¡  | j ¡  dS )zT
        Terminate process; sends SIGKILL signal or uses TerminateProcess()
        N)r7   r   Úkill)r   r   r   r   r>   ~   s    zBaseProcess.killc             C   sR   |   ¡  | jt ¡ kstdƒ‚| jdk	s0tdƒ‚| j |¡}|dk	rNt | ¡ dS )z5
        Wait until child process terminates
        zcan only join a child processNzcan only join a started process)	r7   r"   r    r!   r   r   Úwaitr   r   )r   ZtimeoutZresr   r   r   r+   …   s    zBaseProcess.joinc             C   s`   |   ¡  | tkrdS | jt ¡ ks*tdƒ‚| jdkr8dS | j ¡ }|dkrNdS t 	| ¡ dS dS )z1
        Return whether process is alive
        Tzcan only test a child processNF)
r7   r   r"   r    r!   r   r   r   r   r   )r   Ú
returncoder   r   r   Úis_alive   s    


zBaseProcess.is_alivec             C   sH   | j dk	r>| j  ¡ dkr tdƒ‚| j  ¡  d| _ | `t | ¡ d| _dS )zÂ
        Close the Process object.

        This method releases resources held by the Process object.  It is
        an error to call this method if the child process is still running.
        Nz^Cannot close a process while it is still running. You should first call join() or terminate().T)r   r   r6   Úcloser;   r   r   r#   )r   r   r   r   rB   £   s    


zBaseProcess.closec             C   s   | j S )N)r,   )r   r   r   r   r1   ´   s    zBaseProcess.namec             C   s   t |tƒstdƒ‚|| _d S )Nzname must be a string)Ú
isinstancer   r   r,   )r   r1   r   r   r   r1   ¸   s    c             C   s   | j  dd¡S )z4
        Return whether process is a daemon
        r   F)r   r9   )r   r   r   r   r   ½   s    zBaseProcess.daemonc             C   s    | j dkstdƒ‚|| jd< dS )z1
        Set whether process is a daemon
        Nzprocess has already startedr   )r   r   r   )r   Zdaemonicr   r   r   r   Ä   s    c             C   s
   | j d S )NÚauthkey)r   )r   r   r   r   rD   Ì   s    zBaseProcess.authkeyc             C   s   t |ƒ| jd< dS )z2
        Set authorization key of process
        rD   N)ÚAuthenticationStringr   )r   rD   r   r   r   rD   Ð   s    c             C   s"   |   ¡  | jdkr| jS | j ¡ S )zM
        Return exit code of process or `None` if it has yet to stop
        N)r7   r   r   )r   r   r   r   Úexitcode×   s    
zBaseProcess.exitcodec             C   s*   |   ¡  | tkrt ¡ S | jo$| jjS dS )zU
        Return identifier (PID) of process or `None` if it has yet to start
        N)r7   r   r    r!   r   Úpid)r   r   r   r   Úidentá   s    zBaseProcess.identc             C   s2   |   ¡  y| jS  tk
r,   tdƒd‚Y nX dS )z{
        Return a file descriptor (Unix) or handle (Windows) suitable for
        waiting for process termination.
        zprocess not startedN)r7   r;   ÚAttributeErrorr6   )r   r   r   r   r:   î   s
    zBaseProcess.sentinelc             C   s¤   | t krd}nJ| jrd}n>| jt ¡ kr.d}n*| jd kr>d}n| j ¡ d k	rT| j}nd}t|ƒt	kr‚|dkrrd}ndt
 ||¡ }dt| ƒj| j|| jrœd	pžd
f S )NZstartedÚclosedÚunknownÚinitialr   Zstoppedzstopped[%s]z<%s(%s, %s%s)>z daemonÚ )r   r#   r"   r    r!   r   r   rF   r)   ÚintÚ_exitcode_to_namer9   r*   r,   r   )r   Zstatusr   r   r   Ú__repr__ú   s"    
zBaseProcess.__repr__c          
   C   sR  ddl m}m} zy|| jd k	r,| | j¡ t d¡atƒ a	| 
¡  t}| az|j ¡  | ¡  W d ~X | d¡ z|  ¡  d}W d | ¡  X W n˜ tk
rø } zJ|js®d}n:t|jd tƒrÊ|jd }ntj t|jd ƒd ¡ d}W d d }~X Y n2   d}dd l}tj d| j ¡ | ¡  Y nX W d t ¡  | d| ¡ | ¡  X |S )Né   )ÚutilÚcontextz child process calling self.run()r   Ú
zProcess %s:
z process exiting with exitcode %d) rM   rR   rS   Z_start_methodZ_force_start_methodÚ	itertoolsr4   r   Úsetr   Z_close_stdinr   Z_finalizer_registryÚclearZ_run_after_forkersÚinfor8   Z_exit_functionÚ
SystemExitr2   rC   rN   ÚsysÚstderrÚwriter   Ú	tracebackr1   Ú	print_excÚ	threadingZ	_shutdownZ_flush_std_streams)r   rR   rS   Zold_processrF   Úer]   r   r   r   Ú
_bootstrap  sD    




zBaseProcess._bootstrap)N)r*   Ú
__module__Ú__qualname__Ú__doc__r   r5   r7   r8   r<   r=   r>   r+   rA   rB   Úpropertyr1   Úsetterr   rD   rF   rH   rG   r:   rP   ra   r   r   r   r   r   ?   s0   

c               @   s   e Zd Zdd„ ZdS )rE   c             C   s,   ddl m} |ƒ d krtdƒ‚tt| ƒffS )NrQ   )Úget_spawning_popenzJPickling an AuthenticationString object is disallowed for security reasons)rS   rg   Ú	TypeErrorrE   Úbytes)r   rg   r   r   r   Ú
__reduce__F  s
    
zAuthenticationString.__reduce__N)r*   rb   rc   rj   r   r   r   r   rE   E  s   rE   c               @   s   e Zd Zdd„ Zdd„ ZdS )Ú_MainProcessc             C   s8   d| _ d| _d | _d | _d| _tt d¡ƒddœ| _d S )Nr   ZMainProcessFé    z/mp)rD   Z	semprefix)	r   r,   r"   r   r#   rE   r    Úurandomr   )r   r   r   r   r5   U  s    z_MainProcess.__init__c             C   s   d S )Nr   )r   r   r   r   rB   g  s    z_MainProcess.closeN)r*   rb   rc   r5   rB   r   r   r   r   rk   S  s   rk   rQ   é   ZSIGÚ_)!Ú__all__r    rZ   ÚsignalrU   r_   Z_weakrefsetr   ÚpathÚabspathÚgetcwdZORIGINAL_DIRÚOSErrorr   r   r	   Úobjectr   ri   rE   rk   r   r4   r   rV   r   rO   r
   Ú__dict__Úitemsr1   Zsignumr-   r   r   r   r   Ú<module>
   s6   


  
