o
    éT•jM-  ã                   @   s²  d dl Z d dlZd dlZddlmZ ddlmZ 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G dd„ deƒZG dd„ dejƒZG dd„ deƒZ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jd"kr eed# ƒZn#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é   )Úprocess)Ú	reduction© c                   @   ó   e Zd ZdS )ÚProcessErrorN©Ú__name__Ú
__module__Ú__qualname__r   r   r   ú./usr/lib/python3.10/multiprocessing/context.pyr      ó    r   c                   @   r   )ÚBufferTooShortNr   r   r   r   r   r      r   r   c                   @   r   )ÚTimeoutErrorNr   r   r   r   r   r      r   r   c                   @   r   )ÚAuthenticationErrorNr   r   r   r   r   r      r   r   c                   @   s\  e Zd ZeZeZeZeZeej	ƒZ	eej
ƒZ
eejƒZdd„ Zdd„ ZdCdd„Zdd	„ Zd
d„ ZdDdd„ZdEdd„ZdEdd„Zdd„ ZdFdd„ZdGdd„ZdGdd„Zdd„ Z		dHd d!„Zd"d#„ Zd$d%„ Zdd&œd'd(„Zdd&œd)d*„Zd+d,„ Zd-d.„ ZdDd/d0„Z d1d2„ Z!d3d4„ Z"d5d6„ Z#dDd7d8„Z$dId:d;„Z%dId<d=„Z&e'd>d?„ ƒZ(e(j)d@d?„ ƒZ(dAdB„ Z*dS )JÚBaseContextc                 C   s   t  ¡ }|du rtdƒ‚|S )z(Returns the number of CPUs in the systemNzcannot determine number of cpus)ÚosÚ	cpu_countÚNotImplementedError)ÚselfÚnumr   r   r   r   )   s   zBaseContext.cpu_countc                 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   ÚManager1   s   zBaseContext.ManagerTc                 C   ó   ddl m} ||ƒS )z1Returns two connection object connected by a piper   )ÚPipe)Ú
connectionr    )r   Úduplexr    r   r   r   r    <   ó   zBaseContext.Pipec                 C   ó   ddl m} ||  ¡ d�S )z#Returns a non-recursive lock objectr   )ÚLockr   )Úsynchronizer%   r   )r   r%   r   r   r   r%   A   ó   zBaseContext.Lockc                 C   r$   )zReturns a recursive lock objectr   )ÚRLockr   )r&   r(   r   )r   r(   r   r   r   r(   F   r'   zBaseContext.RLockNc                 C   ó   ddl m} |||  ¡ d�S )zReturns a condition objectr   )Ú	Conditionr   )r&   r*   r   )r   Úlockr*   r   r   r   r*   K   ó   zBaseContext.Conditionr   c                 C   r)   )zReturns a semaphore objectr   )Ú	Semaphorer   )r&   r-   r   )r   Úvaluer-   r   r   r   r-   P   r,   zBaseContext.Semaphorec                 C   r)   )z"Returns a bounded semaphore objectr   )ÚBoundedSemaphorer   )r&   r/   r   )r   r.   r/   r   r   r   r/   U   r,   zBaseContext.BoundedSemaphorec                 C   r$   )zReturns an event objectr   )ÚEventr   )r&   r0   r   )r   r0   r   r   r   r0   Z   r'   zBaseContext.Eventc                 C   ó    ddl m} |||||  ¡ d�S )zReturns a barrier objectr   )ÚBarrierr   )r&   r2   r   )r   ÚpartiesÚactionÚtimeoutr2   r   r   r   r2   _   s   zBaseContext.Barrierr   c                 C   r)   )úReturns a queue objectr   )ÚQueuer   )Úqueuesr7   r   )r   Úmaxsizer7   r   r   r   r7   d   r,   zBaseContext.Queuec                 C   r)   )r6   r   )ÚJoinableQueuer   )r8   r:   r   )r   r9   r:   r   r   r   r:   i   r,   zBaseContext.JoinableQueuec                 C   r$   )r6   r   )ÚSimpleQueuer   )r8   r;   r   )r   r;   r   r   r   r;   n   r'   zBaseContext.SimpleQueuer   c                 C   s"   ddl m} ||||||  ¡ d�S )zReturns a process pool objectr   )ÚPool)Úcontext)Úpoolr<   r   )r   Ú	processesÚinitializerÚinitargsÚmaxtasksperchildr<   r   r   r   r<   s   s   
ÿzBaseContext.Poolc                 G   s   ddl m} ||g|¢R Ž S )zReturns a shared objectr   )ÚRawValue)ÚsharedctypesrC   )r   Útypecode_or_typeÚargsrC   r   r   r   rC   z   r,   zBaseContext.RawValuec                 C   s   ddl m} |||ƒS )zReturns a shared arrayr   )ÚRawArray)rD   rG   )r   rE   Úsize_or_initializerrG   r   r   r   rG      s   
zBaseContext.RawArray)r+   c                G   s(   ddl m} ||g|¢R ||  ¡ dœŽS )z$Returns a synchronized shared objectr   )ÚValue©r+   r   )rD   rI   r   )r   rE   r+   rF   rI   r   r   r   rI   „   s   ÿzBaseContext.Valuec                C   r1   )z#Returns a synchronized shared arrayr   )ÚArrayrJ   )rD   rK   r   )r   rE   rH   r+   rK   r   r   r   rK   Š   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.
        Úwin32ÚfrozenFr   )Úfreeze_supportN)ÚsysÚplatformÚgetattrÚspawnrN   )r   rN   r   r   r   rN   �   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)ÚutilrS   )r   rS   r   r   r   rS   ˜   s   zBaseContext.get_loggerc                 C   r   )z8Turn on logging and add a handler which prints to stderrr   )Úlog_to_stderr)rT   rU   )r   ÚlevelrU   r   r   r   rU   Ÿ   r#   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)rR   rZ   )r   Ú
executablerZ   r   r   r   rZ   ¬   s   zBaseContext.set_executablec                 C   rY   )zkSet list of module names to try to load in forkserver process.
        This is really just a hint.
        r   )Úset_forkserver_preloadN)Ú
forkserverr\   )r   Úmodule_namesr\   r   r   r   r\   ´   s   z"BaseContext.set_forkserver_preloadc                 C   sB   |d u r| S zt | }W n ty   td| ƒd ‚w | ¡  |S )Nzcannot find context for %r)Ú_concrete_contextsÚKeyErrorÚ
ValueErrorÚ_check_available)r   Úmethodr   r   r   r   r   »   s   ÿzBaseContext.get_contextFc                 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)ra   ©r   rc   Úforcer   r   r   Úset_start_methodÈ   s   zBaseContext.set_start_methodc                 C   s   t ƒ  d¡S )z_Controls how objects will be reduced to a form that can be
        shared with other processes.r   )ÚglobalsÚget©r   r   r   r   ÚreducerË   s   zBaseContext.reducerc                 C   s   |t ƒ d< d S )Nr   )rl   )r   r   r   r   r   ro   Ñ   ó   c                 C   ó   d S rd   r   rn   r   r   r   rb   Õ   s   zBaseContext._check_available)Trd   )r   )NN)r   )NNr   N©F)+r	   r
   r   r   r   r   r   Ústaticmethodr   Úcurrent_processÚparent_processÚactive_childrenr   r   r    r%   r(   r*   r-   r/   r0   r2   r7   r:   r;   r<   rC   rG   rI   rK   rN   rS   rU   rX   rZ   r\   r   rh   rk   Úpropertyro   Úsetterrb   r   r   r   r   r      sT    










ÿ






r   c                   @   s(   e Zd ZdZedd„ ƒZedd„ ƒZdS )ÚProcessNc                 C   s   t  ¡ j | ¡S rd   )Ú_default_contextr   ry   Ú_Popen)Úprocess_objr   r   r   r{   Þ   s   zProcess._Popenc                   C   s   t  ¡ j ¡ S rd   )rz   r   ry   Ú_after_forkr   r   r   r   r}   â   rp   zProcess._after_fork©r	   r
   r   Ú_start_methodrs   r{   r}   r   r   r   r   ry   Ü   s    
ry   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 rd   )rz   Ú_actual_context)r   r=   r   r   r   Ú__init__é   s   
zDefaultContext.__init__Nc                    s,   |d u r| j d u r| j| _ | j S tƒ  |¡S rd   )r�   rz   Úsuperr   )r   rc   ©Ú	__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   ri   r   r   r   rk   õ   s   zDefaultContext.set_start_methodc                 C   s"   | j d u r|r	d S | j| _ | j jS rd   )r�   rz   re   rf   r   r   r   rh   ý   s
   
zDefaultContext.get_start_methodc                 C   s>   t jdkrdgS t jdkrddgnddg}tjr| d¡ |S )NrL   rR   ÚdarwinÚforkr]   )rO   rP   r   ÚHAVE_SEND_HANDLEÚappend)r   Úmethodsr   r   r   Úget_all_start_methods  s   

z$DefaultContext.get_all_start_methodsrd   rr   )
r	   r
   r   ry   r‚   r   rk   rh   rŒ   Ú__classcell__r   r   r„   r   r€   æ   s    

r€   rL   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{     r#   zForkProcess._PopenN©r	   r
   r   r   rs   r{   r   r   r   r   r�     ó    r�   c                   @   ó(   e Zd ZdZedd„ ƒZedd„ ƒZdS )ÚSpawnProcessrR   c                 C   r�   r‘   )Úpopen_spawn_posixr’   r”   r   r   r   r{     r#   úSpawnProcess._Popenc                   C   rq   rd   r   r   r   r   r   r}   "  ó   úSpawnProcess._after_forkNr~   r   r   r   r   r˜     ó    
r˜   c                   @   rŽ   )ÚForkServerProcessr]   c                 C   r�   r‘   )Úpopen_forkserverr’   r”   r   r   r   r{   )  r#   zForkServerProcess._PopenNr•   r   r   r   r   rž   '  r–   rž   c                   @   ó   e Zd ZdZeZdS )ÚForkContextrˆ   N)r	   r
   r   re   r�   ry   r   r   r   r   r¡   .  ó    r¡   c                   @   r    ©ÚSpawnContextrR   N©r	   r
   r   re   r˜   ry   r   r   r   r   r¤   2  r¢   r¤   c                   @   s   e Zd ZdZeZdd„ ZdS )ÚForkServerContextr]   c                 C   s   t jstdƒ‚d S )Nz%forkserver start method not available)r   r‰   ra   rn   r   r   r   rb   9  s   ÿz"ForkServerContext._check_availableN)r	   r
   r   re   rž   ry   rb   r   r   r   r   r¦   6  s    r¦   )rˆ   rR   r]   r‡   rR   rˆ   c                   @   r—   )r˜   rR   c                 C   r�   r‘   )Úpopen_spawn_win32r’   r”   r   r   r   r{   M  r#   rš   c                   C   rq   rd   r   r   r   r   r   r}   R  r›   rœ   Nr~   r   r   r   r   r˜   K  r�   c                   @   r    r£   r¥   r   r   r   r   r¤   W  r¢   c                 C   s   t |  t_d S rd   )r_   rz   r�   )rc   r   r   r   Ú_force_start_methodd  s   r¨   c                   C   s   t tdd ƒS )NÚspawning_popen)rQ   Ú_tlsr   r   r   r   Úget_spawning_popenm  s   r«   c                 C   s
   | t _d S rd   )rª   r©   )Úpopenr   r   r   Úset_spawning_popenp  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_spawnings  s   
ÿÿÿr°   ) r   rO   Ú	threadingrW   r   r   Ú__all__Ú	Exceptionr   r   r   r   Úobjectr   ÚBaseProcessry   r€   rP   r�   r˜   rž   r¡   r¤   r¦   r_   rz   r¨   Úlocalrª   r«   r­   r°   r   r   r   r   Ú<module>   sL     ?

,ý
ÿ