U
    ad.                     @   s8  d 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 zej	e
 ZW n ek
rl   dZY nX dd Z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G dd deZdae aedae a[i Zeej  D ]0\Z!Z"e!dd dkrde!krde! ee" < qe Z#dS )BaseProcesscurrent_processactive_childrenparent_process    N)WeakSetc                   C   s   t S )z@
    Return process object representing the current process
    )_current_process r   r   -/usr/lib/python3.8/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   t S )z?
    Return process object representing the parent process
    )_parent_processr   r   r   r	   r   3   s    c                  C   s*   t tD ]} | j d k	rt|  qd S N)r   r   _popenpolldiscard)pr   r   r	   r
   =   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*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 r   )NotImplementedErrorselfr   r   r	   _PopenM   s    zBaseProcess._PopenNr   )daemonc                C   s   |d kst dtt}tj|f | _tj | _t | _	tj
| _d | _d| _|| _t|| _t|| _|pt| 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 r   )str).0ir   r   r	   	<genexpr>^   s     z'BaseProcess.__init__.<locals>.<genexpr>)AssertionErrornext_process_counterr   	_identity_configcopyosgetpid_parent_pidname_parent_namer   _closed_targettuple_argsdict_kwargstype__name__join_namer   	_danglingadd)r   grouptargetr'   argskwargsr   countr   r   r	   __init__P   s"    


zBaseProcess.__init__c                 C   s   | j rtdd S )Nzprocess object is closed)r)   
ValueErrorr   r   r   r	   _check_closedc   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	   rung   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)r<   r   r   r&   r$   r%   r   r"   getr
   r   sentinel	_sentinelr*   r,   r.   r   r4   r   r   r   r	   startn   s    
zBaseProcess.startc                 C   s   |    | j  dS )zT
        Terminate process; sends SIGTERM signal or uses TerminateProcess()
        N)r<   r   	terminater   r   r   r	   rB      s    zBaseProcess.terminatec                 C   s   |    | j  dS )zT
        Terminate process; sends SIGKILL signal or uses TerminateProcess()
        N)r<   r   killr   r   r   r	   rC      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)	r<   r&   r$   r%   r   r   waitr   r   )r   timeoutresr   r   r	   r1      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)
r<   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   r;   closer@   r   r   r)   r   r   r   r	   rI      s    


zBaseProcess.closec                 C   s   | j S r   )r2   r   r   r   r	   r'      s    zBaseProcess.namec                 C   s   t |tstd|| _d S )Nzname must be a string)
isinstancer   r   r2   )r   r'   r   r   r	   r'      s    c                 C   s   | j ddS )z4
        Return whether process is a daemon
        r   F)r"   r>   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	   rK      s    zBaseProcess.authkeyc                 C   s   t || jd< dS )z2
        Set authorization key of process
        rK   N)AuthenticationStringr"   )r   rK   r   r   r	   rK      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)r<   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)r<   r   r$   r%   r   pidr   r   r   r	   ident   s    zBaseProcess.identc                 C   s4   |    z| jW 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)r<   r@   AttributeErrorr;   r   r   r   r	   r?      s
    zBaseProcess.sentinelc                 C   s   d }| t krd}nL| jrd}n@| jt kr2d}n,| jd krBd}n| j }|d k	rZd}nd}t| jd| j	 g}| jd k	r|
d| jj  |
d| j  |
| |d k	rt||}|
d	|  | jr|
d
 dd| S )NZstartedclosedunknowninitialZstoppedzname=%rzpid=%sz	parent=%szexitcode=%sr   z<%s> )r   r)   r&   r$   r%   r   r   r/   r0   r2   appendrN   _exitcode_to_namer>   r   r1   )r   rM   Zstatusinfor   r   r	   __repr__  s0    




zBaseProcess.__repr__c              
   C   sv  ddl m}m} z>z| jd k	r,|| j t	
dat a|  t}| at| j| j|atjrnt   z|j  |  W 5 ~X |d z|   d}W 5 |  X W n tk
r } zJ|jsd}n:t|jd tr|jd }nt j!"t#|jd d  d}W 5 d }~X Y n2   d}dd l$}t j!"d| j%  |&  Y nX W 5 t  |d|  |  X |S )N   )utilcontextz process exiting with exitcode %dz child process calling self.run()r   
zProcess %s:
)' rZ   r[   	threadingZ	_shutdownrW   Z_flush_std_streamsZ_start_methodZ_force_start_method	itertoolsr9   r    setr   Z_close_stdinr   _ParentProcessr(   r&   r   Z_HAVE_THREAD_NATIVE_IDZmain_threadZ_set_native_idZ_finalizer_registryclearZ_run_after_forkersZ_exit_functionr=   
SystemExitr7   rJ   intsysstderrwriter   	tracebackr'   	print_exc)r   Zparent_sentinelrZ   r[   rM   Zold_processerh   r   r   r	   
_bootstrap"  sR    

  


zBaseProcess._bootstrap)N)N)r0   
__module____qualname____doc__r   r:   r<   r=   rA   rB   rC   r1   rH   rI   propertyr'   setterr   rK   rM   rO   rN   r?   rX   rk   r   r   r   r	   r   G   sD   







	


c                   @   s   e Zd Zdd ZdS )rL   c                 C   s,   ddl m} | d krtdtt| ffS )NrY   )get_spawning_popenzJPickling an AuthenticationString object is disallowed for security reasons)r[   rq   	TypeErrorrL   bytes)r   rq   r   r   r	   
__reduce__X  s    
zAuthenticationString.__reduce__N)r0   rl   rm   rt   r   r   r   r	   rL   W  s   rL   c                   @   s6   e Zd Zdd Zdd Zedd Zd
dd	ZeZdS )ra   c                 C   s4   d| _ || _|| _d | _d | _d| _|| _i | _d S )Nr   F)r!   r2   _pidr&   r   r)   r@   r"   )r   r'   rN   r?   r   r   r	   r:   h  s    z_ParentProcess.__init__c                 C   s   ddl m} || jgdd S )Nr   rD   rE   Zmultiprocessing.connectionrD   r@   )r   rD   r   r   r	   rH   r  s    z_ParentProcess.is_alivec                 C   s   | j S r   )ru   r   r   r   r	   rO   v  s    z_ParentProcess.identNc                 C   s    ddl m} || jg|d dS )z6
        Wait until parent process terminates
        r   rv   rw   Nrx   )r   rE   rD   r   r   r	   r1   z  s    z_ParentProcess.join)N)	r0   rl   rm   r:   rH   ro   rO   r1   rN   r   r   r   r	   ra   f  s   


ra   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)rK   Z	semprefix)	r!   r2   r&   r   r)   rL   r$   urandomr"   r   r   r   r	   r:     s    z_MainProcess.__init__c                 C   s   d S r   r   r   r   r   r	   rI     s    z_MainProcess.closeN)r0   rl   rm   r:   rI   r   r   r   r	   ry     s   ry   rY      ZSIG_r   )$__all__r$   re   signalr_   r^   Z_weakrefsetr   pathabspathgetcwdZORIGINAL_DIROSErrorr   r   r   r
   objectr   rs   rL   ra   ry   r   r   r9   r    r`   r   rV   r   __dict__itemsr'   Zsignumr3   r   r   r   r	   <module>
   s@   


  !
