
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
U
    ¡ê,aå.  ã                   @   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rüde!krüde!› �ee" < qüeƒ 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   ú</opt/alt/python38/lib64/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|ƒ| _|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 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	rÊt ||¡}| 
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sÒd}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@   ÿ


  !
