o
    p̦i9/                     @   s2  g d 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y3   dZY nw 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 ]\Z!Z"e!dd dkrde!vrde! ee" < q{e Z#dS ))BaseProcesscurrent_processactive_childrenparent_process    N)WeakSetc                   C      t S )z@
    Return process object representing the current process
    )_current_process r	   r	   ./usr/lib/python3.10/multiprocessing/process.pyr   %      r   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   r   c                   C   r   )z?
    Return process object representing the parent process
    )_parent_processr	   r	   r	   r
   r   3   r   r   c                  C   s*   t tD ]} | j d u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e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 r   )NotImplementedErrorselfr	   r	   r
   _PopenM      zBaseProcess._PopenNr	   )daemonc                C   s   |d u sJ dt t}tj|f | _tj | _t | _tj	| _
d | _d| _|| _t|| _t|| _|pHt| jd ddd | jD  | _|d urQ|| _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>)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i | j dS dS )zQ
        Method to be run in sub-process; can be overridden in sub-class
        N)r,   r.   r0   r   r	   r	   r
   rung   s   zBaseProcess.runc                 C   sz   |    | jdu sJ d| jt ksJ dtjdr"J 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$   getr   r   sentinel	_sentinelr,   r.   r0   r   r6   r   r	   r	   r
   startn   s   
zBaseProcess.startc                 C      |    | j  dS )zT
        Terminate process; sends SIGTERM signal or uses TerminateProcess()
        N)r>   r   	terminater   r	   r	   r
   rE         zBaseProcess.terminatec                 C   rD   )zT
        Terminate process; sends SIGKILL signal or uses TerminateProcess()
        N)r>   r   killr   r	   r	   r
   rG      rF   zBaseProcess.killc                 C   sV   |    | jt ksJ d| jdusJ d| j|}|dur)t|  dS 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   waitr   r   )r   timeoutresr	   r	   r
   r3      s   zBaseProcess.joinc                 C   s\   |    | tu r
dS | jt ksJ d| jdu rdS | j }|du r'dS t|  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   
returncoder	   r	   r
   is_alive   s   


zBaseProcess.is_alivec                 C   sH   | j dur| j  du 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=   closerB   r   r   r+   r   r	   r	   r
   rM      s   



zBaseProcess.closec                 C      | j S r   )r4   r   r	   r	   r
   r)         zBaseProcess.namec                 C   s   t |ts	J d|| _d S )Nzname must be a string)
isinstancer   r4   )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u s	J d|| jd< dS )z1
        Set whether process is a daemon
        Nzprocess has already startedr   )r   r$   )r   daemonicr	   r	   r
   r      s   c                 C   s
   | j d S )Nauthkey)r$   r   r	   r	   r
   rR      s   
zBaseProcess.authkeyc                 C   s   t || jd< dS )z2
        Set authorization key of process
        rR   N)AuthenticationStringr$   )r   rR   r	   r	   r
   rR      s   c                 C   s"   |    | jdu 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u rt S | jo| jjS )zU
        Return identifier (PID) of process or `None` if it has yet to start
        )r>   r   r&   r'   r   pidr   r	   r	   r
   ident   s   zBaseProcess.identc                 C   s*   |    z| jW S  ty   tddw )z{
        Return a file descriptor (Unix) or handle (Windows) suitable for
        waiting for process termination.
        zprocess not startedN)r>   rB   AttributeErrorr=   r   r	   r	   r
   rA      s   
zBaseProcess.sentinelc                 C   s   d }| t u r	d}n&| jrd}n | jt krd}n| jd u r!d}n| j }|d ur-d}nd}t| jd| j	 g}| jd urG|
d| jj  |
d| j  |
| |d uret||}|
d	|  | jrm|
d
 dd| S )Nstartedclosedunknowninitialstoppedzname=%rzpid=%sz	parent=%szexitcode=%sr   z<%s> )r   r+   r(   r&   r'   r   r   r1   r2   r4   appendrU   _exitcode_to_namer@   r   r3   )r   rT   statusinfor	   r	   r
   __repr__  s0   




zBaseProcess.__repr__c              
   C   s  ddl m}m} zzO| jd ur|| j tdat a	|
  t}| at| j| j|atjr6t   z|   W ~n~w |d z|   d}W |  n|  w W nY ty } z%|jd u rhd}nt|jtrr|j}ntjt|jd  d}W Y d }~n?d }~w   d}dd l }tjd| j!  |"  Y W t#  |d|  |$  |S W t#  |d|  |$  |S W t#  |d|  |$  |S t#  |d|  |$  w )N   )utilcontextz child process calling self.run()r   
zProcess %s:
z process exiting with exitcode %d)% rd   re   _start_method_force_start_method	itertoolsr;   r"   setr   _close_stdinr   _ParentProcessr*   r(   r   	threading_HAVE_THREAD_NATIVE_IDmain_thread_set_native_id_after_forkra   r?   _exit_function
SystemExitcoderP   intsysstderrwriter   	tracebackr)   	print_exc	_shutdown_flush_std_streams)r   parent_sentinelrd   re   old_processrT   erz   r	   r	   r
   
_bootstrap"  sh   






zBaseProcess._bootstrapc                  C   s"   ddl m}  | j  |   d S )Nrc   rd   )rg   rd   _finalizer_registryclear_run_after_forkersr   r	   r	   r
   rr   R  s   
zBaseProcess._after_forkr   )r2   
__module____qualname____doc__r   r<   r>   r?   rC   rE   rG   r3   rL   rM   propertyr)   setterr   rR   rT   rV   rU   rA   rb   r   staticmethodrr   r	   r	   r	   r
   r   G   sJ    







	



0r   c                   @   s   e Zd Zdd ZdS )rS   c                 C   s,   ddl m} | d u rtdtt| ffS )Nrc   )get_spawning_popenzJPickling an AuthenticationString object is disallowed for security reasons)re   r   	TypeErrorrS   bytes)r   r   r	   r	   r
   
__reduce__^  s   
zAuthenticationString.__reduce__N)r2   r   r   r   r	   r	   r	   r
   rS   ]  s    rS   c                   @   s6   e Zd Zdd Zdd Zedd Zd
dd	ZeZdS )rm   c                 C   s4   d| _ || _|| _d | _d | _d| _|| _i | _d S )Nr	   F)r#   r4   _pidr(   r   r+   rB   r$   )r   r)   rU   rA   r	   r	   r
   r<   n  s   
z_ParentProcess.__init__c                 C   s   ddl m} || jgdd S )Nr   rH   rI   multiprocessing.connectionrH   rB   )r   rH   r	   r	   r
   rL   x  s   z_ParentProcess.is_alivec                 C   rN   r   )r   r   r	   r	   r
   rV   |  rO   z_ParentProcess.identNc                 C   s    ddl m} || jg|d dS )z6
        Wait until parent process terminates
        r   r   r   Nr   )r   rI   rH   r	   r	   r
   r3     s   z_ParentProcess.joinr   )	r2   r   r   r<   rL   r   rV   r3   rU   r	   r	   r	   r
   rm   l  s    


rm   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	   MainProcessF    z/mp)rR   	semprefix)	r#   r4   r(   r   r+   rS   r&   urandomr$   r   r	   r	   r
   r<     s   z_MainProcess.__init__c                 C   s   d S r   r	   r   r	   r	   r
   rM     r   z_MainProcess.closeN)r2   r   r   r<   rM   r	   r	   r	   r
   r     s    r   rc      SIG_r   )$__all__r&   rw   signalrj   rn   _weakrefsetr   pathabspathgetcwdORIGINAL_DIROSErrorr   r   r   r   objectr   r   rS   rm   r   r   r   r;   r"   rk   r   r_   r   __dict__itemsr)   signumr5   r	   r	   r	   r
   <module>   sB   	

  !

