???<!-- GIF89;a -->
123123123123
.....................................................................................................................................???<!-- GIF89;a -->
123123123123
.....................................................................................................................................3

  \#                 @   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mZ yejjej	 Z
W n ek
rb   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jdae a[i Zx<eejj D ]*\ZZedd dkodekreee < qW 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/lib64/python3.6/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j d k	r
tj|  q
W d S )N)r
   r   _popenpolldiscard)pr   r   r   r	   4   s    r	   c               @   s   e Zd ZdZdd Zdddf i fddddZdd	 Zd
d Zdd Zd%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   _PopenD   s    zBaseProcess._PopenN)daemonc            C   s   |d kst dtt}tj|f | _tjj | _tj | _	d | _
|| _t|| _t|| _|pt| jd djdd | jD  | _|d k	r|| _tj|  d S )Nz#group argument must be None for now-:c             s   s   | ]}t |V  qd S )N)str).0ir   r   r   	<genexpr>S   s    z'BaseProcess.__init__.<locals>.<genexpr>)AssertionErrornext_process_counterr   	_identity_configcopyosgetpid_parent_pidr   _targettuple_argsdict_kwargstype__name__join_namer   	_danglingadd)r   grouptargetnameargskwargsr   countr   r   r   __init__G   s    


zBaseProcess.__init__c             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   runX   s    zBaseProcess.runc             C   st   | j dkstd| jtj ks(tdtjjd s>tdt  | j	| | _ | j j
| _| `| `| `tj|  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%   r'   r   r-   )r   r   r   r   start_   s    
zBaseProcess.startc             C   s   | j j  dS )zT
        Terminate process; sends SIGTERM signal or uses TerminateProcess()
        N)r   	terminate)r   r   r   r   r:   p   s    zBaseProcess.terminatec             C   sJ   | j tj kstd| jdk	s(td| jj|}|dk	rFtj|  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   Ztimeoutresr   r   r   r*   v   s
    zBaseProcess.joinc             C   sX   | t krdS | jtj ks"td| jdkr0dS | jj }|dkrFdS tj|  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   
returncoder   r   r   is_alive   s    


zBaseProcess.is_alivec             C   s   | j S )N)r+   )r   r   r   r   r0      s    zBaseProcess.namec             C   s   t |tstd|| _d S )Nzname must be a string)
isinstancer   r   r+   )r   r0   r   r   r   r0      s    c             C   s   | j jddS )z4
        Return whether process is a daemon
        r   F)r   r6   )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   r@      s    zBaseProcess.authkeyc             C   s   t || jd< dS )z2
        Set authorization key of process
        r@   N)AuthenticationStringr   )r   r@   r   r   r   r@      s    c             C   s   | j dkr| j S | j j S )zM
        Return exit code of process or `None` if it has yet to stop
        N)r   r   )r   r   r   r   exitcode   s    
zBaseProcess.exitcodec             C   s"   | t krtj 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   pid)r   r   r   r   ident   s    zBaseProcess.identc             C   s(   y| j S  tk
r"   t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)r8   AttributeError
ValueError)r   r   r   r   r7      s    zBaseProcess.sentinelc             C   s   | t krd}n>| jtj kr"d}n*| jd kr2d}n| jj d k	rH| j}nd}t|tkrv|dkrfd}ndt	j
|| }dt| j| j|| jrdpd	f S )
NZstartedunknowninitialr   Zstoppedzstopped[%s]z<%s(%s, %s%s)>z daemon )r   r"   r    r!   r   r   rB   r(   int_exitcode_to_namer6   r)   r+   r   )r   Zstatusr   r   r   __repr__   s    
zBaseProcess.__repr__c              C   sJ  ddl m}m} zy|| jd k	r,|j| j tjdat a	|j
  t}| az|jj  |j  W d ~X |jd z| j  d}W d |j  X W n tk
r } zL|jsd}n:t|jd tr|jd }ntjjt|jd d  d}W Y d d }~X n2   d}dd l}tjjd| j  |j  Y nX W d |jd|  |j  X |S )N   )utilcontextz child process calling self.run()r   
zProcess %s:
z process exiting with exitcode %d)rI   rN   rO   Z_start_methodZ_force_start_method	itertoolsr3   r   setr   Z_close_stdinr   Z_finalizer_registryclearZ_run_after_forkersinfor5   Z_exit_function
SystemExitr1   r?   rJ   sysstderrwriter   	tracebackr0   	print_excZ_flush_std_streams)r   rN   rO   Zold_processrB   erY   r   r   r   
_bootstrap   sB    




zBaseProcess._bootstrap)N)r)   
__module____qualname____doc__r   r4   r5   r9   r:   r*   r>   propertyr0   setterr   r@   rB   rD   rC   r7   rL   r\   r   r   r   r   r   >   s*   

	
c               @   s   e Zd Zdd ZdS )rA   c             C   s,   ddl m} | d krtdtt| ffS )NrM   )get_spawning_popenzJPickling an AuthenticationString object is disallowed for security reasons)rO   rb   	TypeErrorrA   bytes)r   rb   r   r   r   
__reduce__  s
    
zAuthenticationString.__reduce__N)r)   r]   r^   re   r   r   r   r   rA     s   rA   c               @   s   e Zd Zdd ZdS )_MainProcessc             C   s2   f | _ d| _d | _d | _ttjddd| _d S )NZMainProcess    z/mp)r@   Z	semprefix)r   r+   r"   r   rA   r    urandomr   )r   r   r   r   r4   -  s    z_MainProcess.__init__N)r)   r]   r^   r4   r   r   r   r   rf   +  s   rf   rM      ZSIG_) __all__r    rV   signalrQ   _weakrefsetr   pathabspathgetcwdZORIGINAL_DIROSErrorr   r   r	   objectr   rd   rA   rf   r   r3   r   rR   r   rK   r
   __dict__itemsr0   Zsignumr,   r   r   r   r   <module>
   s2   


 `
