o
    €¨Êhb3  ã                   @   s”  d dl Z d dlZd dlZd dlZddlmZ g ZdZddlm	Z	m
Z
mZmZmZmZmZ G dd„ dƒZG dd	„ d	ejƒZG d
d„ deƒZedd„ eeƒD ƒƒe_ejdkr˜G dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZeƒ eƒ eƒ dœZeed ƒZnG dd„ dejƒZG dd„ deƒZdeƒ iZeed ƒZd d!„ Ze  ¡ Z!d"d#„ Z"d$d%„ Z#d&d'„ Z$dS )(é    Né   )ÚprocesszIforce_execv is not supported as the billiard C extension is not installed)ÚProcessErrorÚBufferTooShortÚTimeoutErrorÚAuthenticationErrorÚTimeLimitExceededÚSoftTimeLimitExceededÚWorkerLostErrorc                   @   sd  e Zd ZeZeZeZeZeZeZe	Z	e
ejƒZe
ejƒZeedƒr&dd„ Zndd„ Zdd„ ZdEd	d
„Zdd„ Zdd„ ZdFdd„ZdGdd„ZdGdd„Zdd„ ZdHdd„ZdIdd„ZdIdd„Zd d!„ Z	"					dJd#d$„Zd%d&„ Zd'd(„ Zd)d*„ Z d+d,„ Z!d-d.„ Z"d/d0„ Z#dFd1d2„Z$d3d4„ Z%d5d6„ Z&d7d8„ Z'dFd9d:„Z(dKd;d<„Z)dFd=d>„Z*d?d@„ Z+dAdB„ Z,dCdD„ Z-dS )LÚBaseContextÚ	cpu_countc                 C   s   t  ¡ }|du rtdƒ‚|S )z(Returns the number of CPUs in the systemNúcannot determine number of cpus)Úosr   ÚNotImplementedError)ÚselfÚnum© r   úB/var/www/html/env/lib/python3.10/site-packages/billiard/context.pyr   2   s   zBaseContext.cpu_countc              
   C   sô   t jdkrz	ttjd ƒ}W na ttfy   d}Y nUw dt jv s&t jdkrZd}t jdkr1d| }zt |¡�}t| ¡ ƒ}W d   ƒ n1 sHw   Y  W n! tyY   d}Y nw zt 	d¡}W n tt
tfyo   d}Y nw |d	krv|S td
ƒ‚)NÚwin32ÚNUMBER_OF_PROCESSORSr   ÚbsdÚdarwinz/sbin/sysctl -n hw.ncpuz/usrÚSC_NPROCESSORS_ONLNr   r   )ÚsysÚplatformÚintr   ÚenvironÚ
ValueErrorÚKeyErrorÚpopenÚreadÚsysconfÚOSErrorÚAttributeErrorr   )r   r   ÚcommÚpr   r   r   r   :   s4   
ÿ
ÿ€ÿÿc                 C   s&   ddl m} ||  ¡ d�}| ¡  |S )z½Returns a manager associated with a running server process

        The managers methods such as `Lock()`, `Condition()` and `Queue()`
        can be used to create shared objects.
        r   )ÚSyncManager©Úctx)Úmanagersr&   Úget_contextÚstart)r   r&   Úmr   r   r   ÚManagerT   s   zBaseContext.ManagerTFc                 C   s   ddl m} ||||ƒS )z1Returns two connection object connected by a piper   )ÚPipe)Ú
connectionr.   )r   ÚduplexÚ	rnonblockÚ	wnonblockr.   r   r   r   r.   _   s   zBaseContext.Pipec                 C   ó   ddl m} ||  ¡ d�S )z#Returns a non-recursive lock objectr   )ÚLockr'   )Úsynchronizer4   r*   )r   r4   r   r   r   r4   d   ó   zBaseContext.Lockc                 C   r3   )zReturns a recursive lock objectr   )ÚRLockr'   )r5   r7   r*   )r   r7   r   r   r   r7   i   r6   zBaseContext.RLockNc                 C   ó   ddl m} |||  ¡ d�S )zReturns a condition objectr   )Ú	Conditionr'   )r5   r9   r*   )r   Úlockr9   r   r   r   r9   n   ó   zBaseContext.Conditionr   c                 C   r8   )zReturns a semaphore objectr   )Ú	Semaphorer'   )r5   r<   r*   )r   Úvaluer<   r   r   r   r<   s   r;   zBaseContext.Semaphorec                 C   r8   )z"Returns a bounded semaphore objectr   )ÚBoundedSemaphorer'   )r5   r>   r*   )r   r=   r>   r   r   r   r>   x   r;   zBaseContext.BoundedSemaphorec                 C   r3   )zReturns an event objectr   )ÚEventr'   )r5   r?   r*   )r   r?   r   r   r   r?   }   r6   zBaseContext.Eventc                 C   s    ddl m} |||||  ¡ d�S )zReturns a barrier objectr   )ÚBarrierr'   )r5   r@   r*   )r   ÚpartiesÚactionÚtimeoutr@   r   r   r   r@   ‚   s   zBaseContext.Barrierr   c                 C   r8   )úReturns a queue objectr   )ÚQueuer'   )ÚqueuesrE   r*   )r   ÚmaxsizerE   r   r   r   rE   ‡   r;   zBaseContext.Queuec                 C   r8   )rD   r   )ÚJoinableQueuer'   )rF   rH   r*   )r   rG   rH   r   r   r   rH   Œ   r;   zBaseContext.JoinableQueuec                 C   r3   )rD   r   )ÚSimpleQueuer'   )rF   rI   r*   )r   rI   r   r   r   rI   ‘   r6   zBaseContext.SimpleQueuer   c                 C   s<   ddl m} ||||||||||	|
||||||||  ¡ d�S )zReturns a process pool objectr   )ÚPool)Úcontext)ÚpoolrJ   r*   )r   Ú	processesÚinitializerÚinitargsÚmaxtasksperchildrC   Úsoft_timeoutÚlost_worker_timeoutÚmax_restartsÚmax_restart_freqÚon_process_upÚon_process_downÚon_timeout_setÚon_timeout_cancelÚthreadsÚ	semaphoreÚputlocksÚallow_restartrJ   r   r   r   rJ   –   s   
ûzBaseContext.Poolc                 G   s   ddl m} ||g|¢R Ž S )zReturns a shared objectr   )ÚRawValue)Úsharedctypesr]   )r   Útypecode_or_typeÚargsr]   r   r   r   r]   ¥   r;   zBaseContext.RawValuec                 C   s   ddl m} |||ƒS )zReturns a shared arrayr   )ÚRawArray)r^   ra   )r   r_   Úsize_or_initializerra   r   r   r   ra   ª   s   
zBaseContext.RawArrayc                 O   s4   ddl m} | dd¡}||g|¢R ||  ¡ dœŽS )z$Returns a synchronized shared objectr   )ÚValuer:   T©r:   r(   )r^   rc   Úgetr*   )r   r_   r`   Úkwargsrc   r:   r   r   r   rc   ¯   s
   ÿzBaseContext.Valuec                 O   s,   ddl m} | dd¡}|||||  ¡ d�S )z#Returns a synchronized shared arrayr   )ÚArrayr:   Trd   )r^   rg   re   r*   )r   r_   rb   r`   rf   rg   r:   r   r   r   rg   ¶   s
   ÿzBaseContext.Arrayc                 C   s4   t jdkrtt ddƒrddlm} |ƒ  dS dS dS )z‹Check whether this is a fake forked process in a frozen executable.
        If so then run code specified by commandline and exit.
        r   ÚfrozenFr   )Úfreeze_supportN)r   r   ÚgetattrÚspawnri   )r   ri   r   r   r   ri   ½   s   
þzBaseContext.freeze_supportc                 C   s   ddl m} |ƒ S )zZReturn package logger -- if it does not already exist then
        it is created.
        r   )Ú
get_logger)Úutilrl   )r   rl   r   r   r   rl   Å   s   zBaseContext.get_loggerc                 C   s   ddl m} ||ƒS )z8Turn on logging and add a handler which prints to stderrr   )Úlog_to_stderr)rm   rn   )r   Úlevelrn   r   r   r   rn   Ì   ó   zBaseContext.log_to_stderrc                 C   s   ddl m} dS )zVInstall support for sending connections and sockets
        between processes
        r   )r/   N)Ú r/   )r   r/   r   r   r   Úallow_connection_picklingÑ   s   z%BaseContext.allow_connection_picklingc                 C   ó   ddl m} ||ƒ dS )zÌSets the path to a python.exe or pythonw.exe binary used to run
        child processes instead of sys.executable when using the 'spawn'
        start method.  Useful for people embedding Python.
        r   )Úset_executableN)rk   rt   )r   Ú
executablert   r   r   r   rt   Ù   s   zBaseContext.set_executablec                 C   rs   )zkSet list of module names to try to load in forkserver process.
        This is really just a hint.
        r   )Úset_forkserver_preloadN)Ú
forkserverrv   )r   Úmodule_namesrv   r   r   r   rv   á   s   z"BaseContext.set_forkserver_preloadc                 C   s@   |d u r| S zt | }W n ty   td| ƒ‚w | ¡  |S )Nzcannot find context for %r)Ú_concrete_contextsr   r   Ú_check_available)r   Úmethodr(   r   r   r   r*   è   s   ÿzBaseContext.get_contextc                 C   s   | j S ©N)Ú_name©r   Ú
allow_noner   r   r   Úget_start_methodò   s   zBaseContext.get_start_methodc                 C   s   t dƒ‚)Nz+cannot set start method of concrete context)r   ©r   r{   r   r   r   Úset_start_methodõ   s   zBaseContext.set_start_methodc                 C   s   |   ¡ pddkS )NÚfork)r€   ©r   r   r   r   Úforking_is_enabledø   ó   zBaseContext.forking_is_enabledc                 C   s<   |sddl m} |r| jddd� d S t ttƒ¡ d S d S )Nr   )Úsupports_execrk   T)Úforce)Ú_extr‡   r‚   ÚwarningsÚwarnÚRuntimeWarningÚ
W_NO_EXECV)r   r=   r‡   r   r   r   Úforking_enableü   s   ûzBaseContext.forking_enablec                 C   s   d S r|   r   r„   r   r   r   rz     s   zBaseContext._check_available)TFFr|   )r   )NN)r   )NNr   NNNNNr   NNNNTNFF©F).Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r	   r
   Ústaticmethodr   Úcurrent_processÚactive_childrenÚhasattrr   r   r-   r.   r4   r7   r9   r<   r>   r?   r@   rE   rH   rI   rJ   r]   ra   rc   rg   ri   rl   rn   rr   rt   rv   r*   r€   r‚   r…   rŽ   rz   r   r   r   r   r   $   s`    











û




	r   c                   @   s   e Zd ZdZedd„ ƒZdS )ÚProcessNc                 C   s   t  ¡ j | ¡S r|   )Ú_default_contextr*   r—   Ú_Popen)Úprocess_objr   r   r   r™     r†   zProcess._Popen©r�   r‘   r’   Ú_start_methodr“   r™   r   r   r   r   r—     ó    r—   c                       sF   e Zd ZeZdd„ Zd‡ fdd„	Zddd„Zdd	d
„Zdd„ Z‡  Z	S )ÚDefaultContextc                 C   s   || _ d | _d S r|   )r˜   Ú_actual_context)r   rK   r   r   r   Ú__init__  s   
zDefaultContext.__init__Nc                    s0   |d u r| j d u r| j| _ | j S tt| ƒ |¡S r|   )rŸ   r˜   Úsuperrž   r*   r�   ©Ú	__class__r   r   r*     s
   
zDefaultContext.get_contextFc                 C   s<   | j d ur|stdƒ‚|d u r|rd | _ d S |  |¡| _ d S )Nzcontext has already been set)rŸ   ÚRuntimeErrorr*   )r   r{   rˆ   r   r   r   r‚   $  s   zDefaultContext.set_start_methodc                 C   s"   | j d u r|r	d S | j| _ | j jS r|   )rŸ   r˜   r}   r~   r   r   r   r€   ,  s
   
zDefaultContext.get_start_methodc                 C   s2   t jdkrdgS ddlm} |jrg d¢S ddgS )Nr   rk   r   ©Ú	reduction©rƒ   rk   rw   rƒ   )r   r   rq   r¦   ÚHAVE_SEND_HANDLE©r   r¦   r   r   r   Úget_all_start_methods3  s   
z$DefaultContext.get_all_start_methodsr|   r�   )
r�   r‘   r’   r—   r    r*   r‚   r€   rª   Ú__classcell__r   r   r¢   r   rž     s    

rž   c                 c   s    � | ]}|d  dkr|V  qdS )r   Ú_Nr   )Ú.0Úxr   r   r   Ú	<genexpr>=  s   € r¯   r   c                   @   ó   e Zd ZdZedd„ ƒZdS )ÚForkProcessrƒ   c                 C   ó   ddl m} || ƒS ©Nr   )ÚPopen)Ú
popen_forkr´   ©rš   r´   r   r   r   r™   H  rp   zForkProcess._PopenNr›   r   r   r   r   r±   E  r�   r±   c                   @   r°   )ÚSpawnProcessrk   c                 C   r²   r³   )Úpopen_spawn_posixr´   r¶   r   r   r   r™   P  rp   úSpawnProcess._PopenNr›   r   r   r   r   r·   M  r�   r·   c                   @   r°   )ÚForkServerProcessrw   c                 C   r²   r³   )Úpopen_forkserverr´   r¶   r   r   r   r™   X  rp   zForkServerProcess._PopenNr›   r   r   r   r   rº   U  r�   rº   c                   @   ó   e Zd ZdZeZdS )ÚForkContextrƒ   N)r�   r‘   r’   r}   r±   r—   r   r   r   r   r½   ]  ó    r½   c                   @   r¼   ©ÚSpawnContextrk   N©r�   r‘   r’   r}   r·   r—   r   r   r   r   rÀ   a  r¾   rÀ   c                   @   s   e Zd ZdZeZdd„ ZdS )ÚForkServerContextrw   c                 C   s   ddl m} |jstdƒ‚d S )Nr   r¥   z%forkserver start method not available)rq   r¦   r¨   r   r©   r   r   r   rz   i  s   ÿz"ForkServerContext._check_availableN)r�   r‘   r’   r}   rº   r—   rz   r   r   r   r   rÂ   e  s    rÂ   r§   rƒ   c                   @   r°   )r·   rk   c                 C   r²   r³   )Úpopen_spawn_win32r´   r¶   r   r   r   r™   z  rp   r¹   Nr›   r   r   r   r   r·   w  r�   c                   @   r¼   r¿   rÁ   r   r   r   r   rÀ     r¾   rk   c                 C   s   t |  t_d S r|   )ry   r˜   rŸ   )r{   r   r   r   Ú_force_start_method�  s   rÄ   c                   C   s   t tdd ƒS )NÚspawning_popen)rj   Ú_tlsr   r   r   r   Úget_spawning_popen—  s   rÇ   c                 C   s
   | t _d S r|   )rÆ   rÅ   )r   r   r   r   Úset_spawning_popen›  s   
rÈ   c                 C   s    t ƒ d u rtdt| ƒj ƒ‚d S )NzF%s objects should only be shared between processes through inheritance)rÇ   r¤   Útyper�   )Úobjr   r   r   Úassert_spawningŸ  s   
ÿÿÿrË   )%r   r   Ú	threadingrŠ   rq   r   Ú__all__r�   Ú
exceptionsr   r   r   r   r   r	   r
   r   ÚBaseProcessr—   rž   ÚlistÚdirr   r±   r·   rº   r½   rÀ   rÂ   ry   r˜   rÄ   ÚlocalrÆ   rÇ   rÈ   rË   r   r   r   r   Ú<module>   sF    $
 j(

ýÿ