o
    svXj‚+  ã                   @   sT  d dl mZ d dl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	 d dl
mZ ddlmZmZ z
ej e ¡ ¡ZW n eyG   dZY nw g d¢Zdd	„ Zd
d„ Zdd„ Zdd„ Zef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$[eZ%i Z&eej'ƒD ]\Z(Z)e(dd… dkr¤de(vr¤e(e&e) < q�e	ƒ Z*dS )é    )Úabsolute_importN)ÚWeakSet©Úprocessé   )ÚitemsÚstring_t)ÚBaseProcessÚProcessÚcurrent_processÚactive_childrenc                   C   ó   t S )z@
    Return process object representing the current process
    )Ú_current_process© r   r   úM/var/www/html/myproject/venv/lib/python3.10/site-packages/billiard/process.pyr   '   s   r   c                 C   s   |  a t_ d S ©N)r   Ú_mprocr   r   r   r   Ú_set_current_process.   s   r   c                  C   s*   t tƒD ]} | j ¡ d urt | ¡ qd S r   )ÚlistÚ	_childrenÚ_popenÚpollÚdiscard)Úpr   r   r   Ú_cleanup3   s
   
€þr   c              
   C   s*   z|   ¡  W d S  tttfy   Y d S w r   )ÚflushÚAttributeErrorÚEnvironmentErrorÚNotImplementedError)Úfr   r   r   Ú_maybe_flush:   s
   ÿr    c                 C   s(   z| ƒ  W ttƒS  t y   g  Y S w )zN
    Return list of process objects corresponding to live child processes
    )Ú	TypeErrorr   r   )r   r   r   r   r   A   s   ýþr   c                   @   s2  e Zd ZdZdd„ Zddddi dfdd„Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dd„ Z
d5d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ed'd(„ ƒZed)d*„ ƒZed+d,„ ƒZed-d.„ ƒZed/d0„ ƒZd1d2„ Zd3d4„ ZdS )6r	   z€
    Process objects represent activity that is run in a separate process

    The class is analagous to `threading.Thread`
    c                 C   s   t ƒ ‚r   )r   ©Úselfr   r   r   Ú_PopenT   s   zBaseProcess._PopenNr   c           	      K   s°   |d u sJ dƒ‚t tƒ}tj|f | _tj ¡ | _t ¡ | _d | _	|| _
t|ƒ| _t|ƒ| _|pAt| ƒjd d dd„ | jD ƒ¡ | _|d urJ|| _td urSt | ¡ d| _d S )Nz#group argument must be None for nowú-ú:c                 s   s   � | ]}t |ƒV  qd S r   )Ústr)Ú.0Úir   r   r   Ú	<genexpr>d   s   € z'BaseProcess.__init__.<locals>.<genexpr>F)ÚnextÚ_process_counterr   Ú	_identityÚ_configÚcopyÚosÚgetpidÚ_parent_pidr   Ú_targetÚtupleÚ_argsÚdictÚ_kwargsÚtypeÚ__name__ÚjoinÚ_nameÚdaemonÚ	_danglingÚaddÚ_controlled_termination)	r#   ÚgroupÚtargetÚnameÚargsÚkwargsr<   Ú_kwÚcountr   r   r   Ú__init__W   s$   


ÿÿ

zBaseProcess.__init__c                 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)r3   r5   r7   r"   r   r   r   Úrunm   s   ÿzBaseProcess.runc                 C   sR   | j du s	J dƒ‚| jt ¡ ks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 process)
r   r2   r0   r1   r   r$   ÚsentinelÚ	_sentinelr   r>   r"   r   r   r   Ústartt   s   ÿ
zBaseProcess.startc                 C   s   | j d ur| j  ¡  d S d S r   )r   Úcloser"   r   r   r   rL   €   s   
ÿzBaseProcess.closec                 C   s   | j  ¡  dS )zT
        Terminate process; sends SIGTERM signal or uses TerminateProcess()
        N)r   Ú	terminater"   r   r   r   rM   „   s   zBaseProcess.terminatec                 C   s   d| _ |  ¡  d S )NT)r?   rM   r"   r   r   r   Úterminate_controlledŠ   s   z BaseProcess.terminate_controlledc                 C   sR   | j t ¡ ksJ dƒ‚| jdusJ dƒ‚| j |¡}|dur#t | ¡ |  ¡  dS )z5
        Wait until child process terminates
        zcan only join a child processNzcan only join a started process)r2   r0   r1   r   Úwaitr   r   rL   )r#   ÚtimeoutÚresr   r   r   r:   Ž   s   
zBaseProcess.joinc                 C   sF   | t u rdS | jt ¡ ksJ dƒ‚| jdu rdS | j ¡  | jjdu S )z1
        Return whether process is alive
        Tzcan only test a child processNF)r   r2   r0   r1   r   r   Ú
returncoder"   r   r   r   Úis_alive™   s   

zBaseProcess.is_alivec                 C   s   | j d u rdS | j  ¡ d u S )NF©r   r   r"   r   r   r   Ú	_is_alive¥   s   
zBaseProcess._is_alivec                 C   ó   | j S r   )r;   r"   r   r   r   rB   ª   s   zBaseProcess.namec                 C   s   t |tƒs	J dƒ‚|| _d S )Nzname must be a string)Ú
isinstancer   r;   )r#   rB   r   r   r   rB   ®   s   
c                 C   s   | j  dd¡S )z4
        Return whether process is a daemon
        r<   F©r.   Úgetr"   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   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u r| j S | j  ¡ S )zM
        Return exit code of process or `None` if it has yet to stop
        NrT   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   r0   r1   r   Úpidr"   r   r   r   ÚidentÖ   s   zBaseProcess.identc                 C   s    z| j W S  ty   tdƒ‚w )z{
        Return a file descriptor (Unix) or handle (Windows) suitable for
        waiting for process termination.
        zprocess not started)rJ   r   Ú
ValueErrorr"   r   r   r   rI   â   s
   ÿzBaseProcess.sentinelc                 C   r   r   )r,   r"   r   r   r   Ú_counterí   ó   zBaseProcess._counterc                 C   r   r   )r   r"   r   r   r   r   ò   rb   zBaseProcess._childrenc                 C   rV   r   )r[   r"   r   r   r   Ú_authkey÷   ó   zBaseProcess._authkeyc                 C   rV   r   )r<   r"   r   r   r   Ú	_daemonicü   rd   zBaseProcess._daemonicc                 C   s   | j  d¡S )NÚtempdirrX   r"   r   r   r   Ú_tempdir  s   zBaseProcess._tempdirc                 C   s˜   | t u rd}n| jt ¡ krd}n| jd u rd}n| j ¡ d ur$| j}nd}t|ƒtu r;|dkr3d}ndt	 
||¡ }dt| ƒj| j|| jrHdpId	f S )
NÚstartedÚunknownÚinitialr   Ústoppedzstopped[%s]z<%s(%s, %s%s)>z daemonÚ )r   r2   r0   r1   r   r   r]   r8   ÚintÚ_exitcode_to_namerY   r9   r;   r<   )r#   Ústatusr   r   r   Ú__repr__  s    
ÿzBaseProcess.__repr__c                 C   s¨  ddl m}m} �z7z“| jd ur| | j¡ t d¡atƒ a	t
jd ur=zt
j ¡  ttjƒt
_W n tttfy<   Y nw t}t| ƒ tjjj}t| ¡ ƒ}| d ¡ |D ]}|rat|| tjƒsnt |¡jD ]}|  ¡  qgqUt! "¡ t_#z|j$ %¡  | &¡  W ~n~w | 'd| j(¡ z|  )¡  d}W | *¡  n| *¡  w W ny t+yá }	 z8|	j,s«d}n,t|	j,d t-ƒr¹|	j,d }nt
j. /t0|	j,d ƒd ¡ t1t
j.ƒ t|	j,d t0ƒrÕdnd}W Y d }	~	nOd }	~	w   d}|j2d| j3dd��sdd l4}
t
j. /d	| j3 ¡ |
 5¡  Y W | 'd
| j(|¡ t1t
j6ƒ t1t
j.ƒ |S W | 'd
| j(|¡ t1t
j6ƒ t1t
j.ƒ |S W | 'd
| j(|¡ t1t
j6ƒ t1t
j.ƒ |S | 'd
| j(|¡ t1t
j6ƒ t1t
j.ƒ w )Nr   )ÚutilÚcontextz#child process %s calling self.run()r   Ú
z
Process %sT)Úexc_infozProcess %s:
z#process %s exiting with exitcode %d)7rl   rq   rr   Ú_start_methodÚ_force_start_methodÚ	itertoolsrF   r,   Úsetr   ÚsysÚstdinrL   Úopenr0   Údevnullr   ÚOSErrorr`   r   r   ÚloggingÚLoggerÚmanagerÚ
loggerDictr   ÚkeysÚappendrW   ÚPlaceHolderÚ	getLoggerÚhandlersÚ
createLockÚ	threadingÚRLockÚ_lockÚ_finalizer_registryÚclearÚ_run_after_forkersÚinfor^   rH   Ú_exit_functionÚ
SystemExitrC   rm   ÚstderrÚwriter'   r    ÚerrorrB   Ú	tracebackÚ	print_excÚstdout)r#   rq   rr   Úold_processr�   Úlogger_namesrB   Úhandlerr]   Úexcr”   r   r   r   Ú
_bootstrap  s˜   



ÿ

ÿ
€



€€ÿ

êÿ

€ûÿ

ûÿ
zBaseProcess._bootstrapr   )r9   Ú
__module__Ú__qualname__Ú__doc__r$   rG   rH   rK   rL   rM   rN   r:   rS   rU   ÚpropertyrB   Úsetterr<   r[   r]   r_   r^   rI   ra   r   rc   re   rg   rp   r›   r   r   r   r   r	   M   sZ    
ÿ








	






r	   c                   @   ó   e Zd Zdd„ ZdS )r\   c                 C   s,   ddl m} |ƒ d u rtdƒ‚tt| ƒffS )Nr   )Úget_spawning_popenzJPickling an AuthenticationString object is disallowed for security reasons)rr   r¢   r!   r\   Úbytes)r#   r¢   r   r   r   Ú
__reduce__i  s   
ÿzAuthenticationString.__reduce__N)r9   rœ   r�   r¤   r   r   r   r   r\   g  ó    r\   c                   @   r¡   )Ú_MainProcessc                 C   s2   d| _ d| _d | _d | _tt d¡ƒddœ| _d S )Nr   ÚMainProcessé    z/mp)r[   Ú	semprefix)r-   r;   r2   r   r\   r0   Úurandomr.   r"   r   r   r   rG   y  s   ÿz_MainProcess.__init__N)r9   rœ   r�   rG   r   r   r   r   r¦   w  r¥   r¦   é   ÚSIGÚ_)+Ú
__future__r   r0   ry   Úsignalrw   r~   rˆ   Ú_weakrefsetr   Úmultiprocessingr   r   Úfiver   r   ÚpathÚabspathÚgetcwdÚORIGINAL_DIRr}   Ú__all__r   r   r   r    r   Úobjectr	   r£   r\   r¦   r   rF   r,   rx   r   r
   rn   Ú__dict__rB   Úsignumr=   r   r   r   r   Ú<module>   sJ   ÿ  


€
