B
    2*™\¯*  ã               @   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   úBC:\ALexclude\prg\programme\Python37\Lib\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˜   t tƒ}tj|f | _tj ¡ | _t ¡ | _d | _	d| _
|| _t|ƒ| _t|ƒ| _|pxt| ƒjd d dd„ | jD ƒ¡ | _|d k	rŠ|| _t | ¡ d S )NFú-ú:c             s   s   | ]}t |ƒV  qd S )N)Ústr)Ú.0Úir   r   r   ú	<genexpr>U   s    z'BaseProcess.__init__.<locals>.<genexpr>)Ú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   s>   |   ¡  tƒ  |  | ¡| _| jj| _| `| `| `t	 
| ¡ dS )z%
        Start child process
        N)r6   r	   r   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)r6   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)r6   r   Úkill)r   r   r   r   r<   ~   s    zBaseProcess.killc             C   s*   |   ¡  | j |¡}|dk	r&t | ¡ dS )z5
        Wait until child process terminates
        N)r6   r   Úwaitr   r   )r   ZtimeoutÚresr   r   r   r*   …   s    zBaseProcess.joinc             C   sJ   |   ¡  | tkrdS | jdkr"dS | j ¡ }|dkr8dS t | ¡ dS dS )z1
        Return whether process is alive
        TNF)r6   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   r5   Úcloser9   r   r   r"   )r   r   r   r   rA   £   s    


zBaseProcess.closec             C   s   | j S )N)r+   )r   r   r   r   r0   ´   s    zBaseProcess.namec             C   s
   || _ d S )N)r+   )r   r0   r   r   r   r0   ¸   s    c             C   s   | j  dd¡S )z4
        Return whether process is a daemon
        r   F)r   Úget)r   r   r   r   r   ½   s    zBaseProcess.daemonc             C   s   || j d< dS )z1
        Set whether process is a daemon
        r   N)r   )r   Zdaemonicr   r   r   r   Ä   s    c             C   s
   | j d S )NÚauthkey)r   )r   r   r   r   rC   Ì   s    zBaseProcess.authkeyc             C   s   t |ƒ| jd< dS )z2
        Set authorization key of process
        rC   N)ÚAuthenticationStringr   )r   rC   r   r   r   rC   Ð   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)r6   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)r6   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)r6   r9   ÚAttributeErrorr5   )r   r   r   r   r8   î   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   rE   r(   ÚintÚ_exitcode_to_namerB   r)   r+   r   )r   Ú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) rL   rR   rS   Z_start_methodZ_force_start_methodÚ	itertoolsr3   r   Úsetr   Z_close_stdinr   Z_finalizer_registryÚclearZ_run_after_forkersÚinfor7   Z_exit_functionÚ
SystemExitr1   Ú
isinstancerM   ÚsysÚstderrÚwriter   Ú	tracebackr0   Ú	print_excÚ	threadingZ	_shutdownZ_flush_std_streams)r   rR   rS   Zold_processrE   Úer^   r   r   r   Ú
_bootstrap  sD    




zBaseProcess._bootstrap)N)r)   Ú
__module__Ú__qualname__Ú__doc__r   r4   r6   r7   r:   r;   r<   r*   r@   rA   Úpropertyr0   Úsetterr   rC   rE   rG   rF   r8   rP   rb   r   r   r   r   r   ?   s0   

c               @   s   e Zd Zdd„ ZdS )rD   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   rh   Ú	TypeErrorrD   Úbytes)r   rh   r   r   r   Ú
__reduce__F  s
    
zAuthenticationString.__reduce__N)r)   rc   rd   rk   r   r   r   r   rD   E  s   rD   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)rC   Z	semprefix)	r   r+   r!   r   r"   rD   r   Úurandomr   )r   r   r   r   r4   U  s    z_MainProcess.__init__c             C   s   d S )Nr   )r   r   r   r   rA   g  s    z_MainProcess.closeN)r)   rc   rd   r4   rA   r   r   r   r   rl   S  s   rl   rQ   é   ZSIGÚ_)!Ú__all__r   r[   ÚsignalrU   r`   Z_weakrefsetr   ÚpathÚabspathÚgetcwdZORIGINAL_DIRÚOSErrorr   r   r	   Úobjectr   rj   rD   rl   r   r3   r   rV   r   rN   r
   Ú__dict__Úitemsr0   Zsignumr,   r   r   r   r   Ú<module>
   s6   


  
