a XC?h�+�@s�ddlZddlZddlZddlmZddlmZdZGdd�de�ZGdd �d e�Z Gd d �d e�Z Gd d �d e�Z Gdd�de �Z Gdd�dej�ZGdd�de �Zejdk�rRGdd�dej�ZGdd�dej�ZGdd�dej�ZGdd�de �ZGdd�de �ZGdd �d e �Ze�e�e�d!�Zejd"k�rDeed#�Zn eed$�Zn8Gd%d�dej�ZGd&d�de �Zd#e�iZeed#�Zd'd(�Ze��Zd)d*�Zd+d,�Zd-d.�ZdS)/�N�)�process)� reduction�c@s eZdZdS)� ProcessErrorN��__name__� __module__� __qualname__rrr�d?��Z(e(j)d@d?��Z(dAdB�Z*d S)O� BaseContextcCs"t��}|durtd��n|SdS)z(Returns the number of CPUs in the systemNzcannot determine number of cpus)�os� cpu_count�NotImplementedError)�selfZnumrrr r)s zBaseContext.cpu_countcCs&ddlm}||��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)Zmanagersr� get_context�start)rr�mrrr �Manager1s zBaseContext.ManagerTcCsddlm}||�S)z1Returns two connection object connected by a piper)�Pipe)� connectionr)rZduplexrrrr r<s zBaseContext.PipecCsddlm}||��d�S)z#Returns a non-recursive lock objectr)�Lockr)� synchronizerr)rrrrr rAs zBaseContext.LockcCsddlm}||��d�S)zReturns a recursive lock objectr)�RLockr)rrr)rrrrr rFs zBaseContext.RLockNcCsddlm}|||��d�S)zReturns a condition objectr)� Conditionr)rr r)r�lockr rrr r Ks zBaseContext.ConditionrcCsddlm}|||��d�S)zReturns a semaphore objectr)� Semaphorer)rr"r)r�valuer"rrr r"Ps zBaseContext.SemaphorecCsddlm}|||��d�S)z"Returns a bounded semaphore objectr)�BoundedSemaphorer)rr$r)rr#r$rrr r$Us zBaseContext.BoundedSemaphorecCsddlm}||��d�S)zReturns an event objectr)�Eventr)rr%r)rr%rrr r%Zs zBaseContext.EventcCs ddlm}|||||��d�S)zReturns a barrier objectr)�Barrierr)rr&r)rZparties�actionZtimeoutr&rrr r&_s zBaseContext.BarrierrcCsddlm}|||��d�S)�Returns a queue objectr)�Queuer)�queuesr)r)r�maxsizer)rrr r)ds zBaseContext.QueuecCsddlm}|||��d�S)r(r)� JoinableQueuer)r*r,r)rr+r,rrr r,is zBaseContext.JoinableQueuecCsddlm}||��d�S)r(r)� SimpleQueuer)r*r-r)rr-rrr r-ns zBaseContext.SimpleQueuercCs"ddlm}||||||��d�S)zReturns a process pool objectr)�Pool)�context)Zpoolr.r)rZ processesZ initializerZinitargsZmaxtasksperchildr.rrr r.ss  �zBaseContext.PoolcGsddlm}||g|�R�S)zReturns a shared objectr)�RawValue)� sharedctypesr0)r�typecode_or_type�argsr0rrr r0zs zBaseContext.RawValuecCsddlm}|||�S)zReturns a shared arrayr)�RawArray)r1r4)rr2�size_or_initializerr4rrr r4s zBaseContext.RawArray)r!cGs(ddlm}||g|�R||��d��S)z$Returns a synchronized shared objectr)�Value�r!r)r1r6r)rr2r!r3r6rrr r6�s �zBaseContext.ValuecCs ddlm}|||||��d�S)z#Returns a synchronized shared arrayr)�Arrayr7)r1r8r)rr2r5r!r8rrr r8�s �zBaseContext.ArraycCs,tjdkr(ttdd�r(ddlm}|�dS)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�spawnr;)rr;rrr r;�s zBaseContext.freeze_supportcCsddlm}|�S)zZReturn package logger -- if it does not already exist then it is created. r)� get_logger)�utilr@)rr@rrr r@�s zBaseContext.get_loggercCsddlm}||�S)z8Turn on logging and add a handler which prints to stderrr)� log_to_stderr)rArB)r�levelrBrrr rB�s zBaseContext.log_to_stderrcCsddlm}dS)zVInstall support for sending connections and sockets between processes r)rN)�r)rrrrr �allow_connection_pickling�sz%BaseContext.allow_connection_picklingcCsddlm}||�dS)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)r?rF)r� executablerFrrr rF�s zBaseContext.set_executablecCsddlm}||�dS)zkSet list of module names to try to load in forkserver process. This is really just a hint. r)�set_forkserver_preloadN)� forkserverrH)rZ module_namesrHrrr rH�s z"BaseContext.set_forkserver_preloadcCsF|dur |Sz t|}Wn ty8td|�d�Yn0|��|S)Nzcannot find context for %r)�_concrete_contexts�KeyError� ValueError�_check_available)r�methodrrrr r�s  zBaseContext.get_contextFcCs|jS�N)�_name�rZ allow_nonerrr �get_start_method�szBaseContext.get_start_methodcCs td��dS)Nz+cannot set start method of concrete context)rL�rrNZforcerrr �set_start_method�szBaseContext.set_start_methodcCs t��d�S)z_Controls how objects will be reduced to a form that can be shared with other processes.r)�globals�get�rrrr �reducer�szBaseContext.reducercCs|t�d<dS)Nr)rU)rrrrr rX�scCsdSrOrrWrrr rM�szBaseContext._check_available)T)N)r)r)NN)r)r)NNrN)N)N)F)F)+rr r rr r r� staticmethodrZcurrent_processZparent_processZactive_childrenrrrrrr r"r$r%r&r)r,r-r.r0r4r6r8r;r@rBrErFrHrrRrT�propertyrX�setterrMrrrr rsR          �      rc@seZdZdZedd��ZdS)�ProcessNcCst��j�|�SrO)�_default_contextrr\�_Popen)� process_objrrr r^�szProcess._Popen�rr r Z _start_methodrYr^rrrr r\�sr\csFeZdZeZdd�Zd �fdd� Zddd�Zdd d �Zd d �Z�Z S)�DefaultContextcCs||_d|_dSrO)r]�_actual_context)rr/rrr �__init__�szDefaultContext.__init__Ncs0|dur |jdur|j|_|jSt��|�SdSrO)rbr]�superr)rrN�� __class__rr r�s  zDefaultContext.get_contextFcCs<|jdur|std��|dur,|r,d|_dS|�|�|_dS)Nzcontext has already been set)rb� RuntimeErrorrrSrrr rT�s  zDefaultContext.set_start_methodcCs"|jdur|rdS|j|_|jjSrO)rbr]rPrQrrr rR�s  zDefaultContext.get_start_methodcCsBtjdkrdgStjdkr"ddgnddg}tjr:|�d�|SdS)Nr9r?�darwin�forkrI)r<r=r�HAVE_SEND_HANDLE�append)r�methodsrrr �get_all_start_methodss   z$DefaultContext.get_all_start_methods)N)F)F) rr r r\rcrrTrRrm� __classcell__rrrer ra�s   rar9c@seZdZdZedd��ZdS)� ForkProcessricCsddlm}||�S�Nr)�Popen)Z popen_forkrq�r_rqrrr r^s zForkProcess._PopenNr`rrrr rosroc@seZdZdZedd��ZdS)� SpawnProcessr?cCsddlm}||�Srp)Zpopen_spawn_posixrqrrrrr r^s �SpawnProcess._PopenNr`rrrr rssrsc@seZdZdZedd��ZdS)�ForkServerProcessrIcCsddlm}||�Srp)Zpopen_forkserverrqrrrrr r^ s zForkServerProcess._PopenNr`rrrr rusruc@seZdZdZeZdS)� ForkContextriN)rr r rPror\rrrr rv%srvc@seZdZdZeZdS�� SpawnContextr?N�rr r rPrsr\rrrr rx)srxc@seZdZdZeZdd�ZdS)�ForkServerContextrIcCstjstd��dS)Nz%forkserver start method not available)rrjrLrWrrr rM0sz"ForkServerContext._check_availableN)rr r rPrur\rMrrrr rz-srz)rir?rIrhr?ric@seZdZdZedd��ZdS)rsr?cCsddlm}||�Srp)Zpopen_spawn_win32rqrrrrr r^Ds rtNr`rrrr rsBsc@seZdZdZeZdSrwryrrrr rxIscCst|t_dSrO)rJr]rb)rNrrr �_force_start_methodVsr{cCs ttdd�S)N�spawning_popen)r>�_tlsrrrr �get_spawning_popen_sr~cCs |t_dSrO)r}r|)�popenrrr �set_spawning_popenbsr�cCs t�durtdt|�j��dS)NzF%s objects should only be shared between processes through inheritance)r~rg�typer)�objrrr �assert_spawninges  ��r�) rr<Z threadingrDrr�__all__� Exceptionrr r r�objectrZ BaseProcessr\rar=rorsrurvrxrzrJr]r{Zlocalr}r~r�r�rrrr �sJ  ?, � �