B /g^*@sddlZddlZddlZddlmZddlmZgZGdddeZGdddeZ Gd d d eZ Gd d d eZ Gd dde Z GdddejZGddde ZddeeDe_ejdkrLGdddejZGdddejZGdddejZGddde ZGddde ZGd d!d!e Zeeed"Zeed#Zn8Gd$ddejZGd%dde Zd&eiZeed&Zd'd(ZeZd)d*Zd+d,Zd-d.Z dS)/N)process) reductionc@s eZdZdS) ProcessErrorN)__name__ __module__ __qualname__r r //usr/lib64/python3.7/multiprocessing/context.pyrsrc@s eZdZdS)BufferTooShortN)rrrr r r r r sr c@s eZdZdS) TimeoutErrorN)rrrr r r r r sr c@s eZdZdS)AuthenticationErrorN)rrrr r r r r sr c@sNeZdZeZeZeZeZeej Z eej Z ddZ ddZ dCddZ dd Zd d ZdDd dZdEddZdFddZddZdGddZdHddZdIddZddZdJd d!Zd"d#Zd$d%Zdd&d'd(Zdd&d)d*Zd+d,Zd-d.ZdKd/d0Zd1d2Z d3d4Z!d5d6Z"dLd7d8Z#dMd:d;Z$dNdd?Z'e'j(d@d?Z'dAdBZ)d S)O BaseContextcCs"t}|dkrtdn|SdS)z(Returns the number of CPUs in the systemNzcannot determine number of cpus)os cpu_countNotImplementedError)selfZnumr r r r(s zBaseContext.cpu_countcCs&ddlm}||d}||S)zReturns 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_contextstart)rrmr r r Manager0s zBaseContext.ManagerTcCsddlm}||S)z1Returns two connection object connected by a piper)Pipe) connectionr)rZduplexrr r r r;s zBaseContext.PipecCsddlm}||dS)z#Returns a non-recursive lock objectr)Lock)r) synchronizerr)rrr r r r@s zBaseContext.LockcCsddlm}||dS)zReturns a recursive lock objectr)RLock)r)rrr)rrr r r rEs zBaseContext.RLockNcCsddlm}|||dS)zReturns a condition objectr) Condition)r)rrr)rlockrr r r rJs zBaseContext.ConditionrcCsddlm}|||dS)zReturns a semaphore objectr) Semaphore)r)rr r)rvaluer r r r r Os zBaseContext.SemaphorecCsddlm}|||dS)z"Returns a bounded semaphore objectr)BoundedSemaphore)r)rr"r)rr!r"r r r r"Ts zBaseContext.BoundedSemaphorecCsddlm}||dS)zReturns an event objectr)Event)r)rr#r)rr#r r r r#Ys zBaseContext.EventcCs ddlm}|||||dS)zReturns a barrier objectr)Barrier)r)rr$r)rZpartiesactionZtimeoutr$r r r r$^s zBaseContext.BarrierrcCsddlm}|||dS)zReturns a queue objectr)Queue)r)queuesr&r)rmaxsizer&r r r r&cs zBaseContext.QueuecCsddlm}|||dS)zReturns a queue objectr) JoinableQueue)r)r'r)r)rr(r)r r r r)hs zBaseContext.JoinableQueuecCsddlm}||dS)zReturns a queue objectr) SimpleQueue)r)r'r*r)rr*r r r r*ms zBaseContext.SimpleQueuer cCs"ddlm}||||||dS)zReturns a process pool objectr)Pool)context)Zpoolr+r)rZ processesZ initializerZinitargsZmaxtasksperchildr+r r r r+rs  zBaseContext.PoolcGsddlm}||f|S)zReturns a shared objectr)RawValue) sharedctypesr-)rtypecode_or_typeargsr-r r r r-ys zBaseContext.RawValuecCsddlm}|||S)zReturns a shared arrayr)RawArray)r.r1)rr/size_or_initializerr1r r r r1~s zBaseContext.RawArray)rcGs&ddlm}||f|||dS)z$Returns a synchronized shared objectr)Value)rr)r.r3r)rr/rr0r3r r r r3s  zBaseContext.ValuecCs ddlm}|||||dS)z#Returns a synchronized shared arrayr)Array)rr)r.r4r)rr/r2rr4r r r r4s zBaseContext.ArraycCs,tjdkr(ttddr(ddlm}|dS)zCheck whether this is a fake forked process in a frozen executable. If so then run code specified by commandline and exit. win32frozenFr)freeze_supportN)sysplatformgetattrspawnr7)rr7r r r r7s zBaseContext.freeze_supportcCsddlm}|S)zZReturn package logger -- if it does not already exist then it is created. r) get_logger)utilr<)rr<r r r r<s zBaseContext.get_loggercCsddlm}||S)z8Turn on logging and add a handler which prints to stderrr) log_to_stderr)r=r>)rlevelr>r r r r>s zBaseContext.log_to_stderrcCsddlm}dS)zVInstall support for sending connections and sockets between processes r)rN)r)rrr r r allow_connection_picklingsz%BaseContext.allow_connection_picklingcCsddlm}||dS)zSets 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;rB)r executablerBr r r rBs 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) forkserverrD)rZ module_namesrDr r r rDs z"BaseContext.set_forkserver_preloadcCsH|dkr |Sy t|}Wn"tk r:td|dYnX||S)Nzcannot find context for %r)_concrete_contextsKeyError ValueError_check_available)rmethodrr r r rs zBaseContext.get_contextFcCs|jS)N)_name)r allow_noner r r get_start_methodszBaseContext.get_start_methodcCs tddS)Nz+cannot set start method of concrete context)rH)rrJforcer r r set_start_methodszBaseContext.set_start_methodcCs tdS)z_Controls how objects will be reduced to a form that can be shared with other processes.r)globalsget)rr r r reducerszBaseContext.reducercCs|td<dS)Nr)rP)rrr r r rRscCsdS)Nr )rr r r rIszBaseContext._check_available)T)N)r)r)NN)r)r)NNr N)N)N)F)F)*rrrrr r r staticmethodrZcurrent_processZactive_childrenrrrrrrr r"r#r$r&r)r*r+r-r1r3r4r7r<r>rArBrDrrMrOpropertyrRsetterrIr r r r rsJ              rc@seZdZdZeddZdS)ProcessNcCstj|S)N)_default_contextrrV_Popen) process_objr r r rXszProcess._Popen)rrr _start_methodrSrXr r r r rVsrVcsFeZdZeZddZd fdd ZdddZdd d Zd d ZZ S)DefaultContextcCs||_d|_dS)N)rW_actual_context)rr,r r r __init__szDefaultContext.__init__Ncs0|dkr |jdkr|j|_|jSt|SdS)N)r\rWsuperr)rrJ) __class__r r rs  zDefaultContext.get_contextFcCs<|jdk r|std|dkr,|r,d|_dS|||_dS)Nzcontext has already been set)r\ RuntimeErrorr)rrJrNr r r rOs  zDefaultContext.set_start_methodcCs"|jdkr|rdS|j|_|jjS)N)r\rWrK)rrLr r r rMs  zDefaultContext.get_start_methodcCs,tjdkrdgStjr dddgSddgSdS)Nr5r;forkrE)r8r9rHAVE_SEND_HANDLE)rr r r get_all_start_methodss   z$DefaultContext.get_all_start_methods)N)F)F) rrrrVr]rrOrMrc __classcell__r r )r_r r[s   r[cCsg|]}|ddkr|qS)r_r ).0xr r r srhr5c@seZdZdZeddZdS) ForkProcessracCsddlm}||S)Nr)Popen)Z popen_forkrj)rYrjr r r rXs zForkProcess._PopenN)rrrrZrSrXr r r r risric@seZdZdZeddZdS) SpawnProcessr;cCsddlm}||S)Nr)rj)Zpopen_spawn_posixrj)rYrjr r r rXs zSpawnProcess._PopenN)rrrrZrSrXr r r r rksrkc@seZdZdZeddZdS)ForkServerProcessrEcCsddlm}||S)Nr)rj)Zpopen_forkserverrj)rYrjr r r rX s zForkServerProcess._PopenN)rrrrZrSrXr r r r rlsrlc@seZdZdZeZdS) ForkContextraN)rrrrKrirVr r r r rm%srmc@seZdZdZeZdS) SpawnContextr;N)rrrrKrkrVr r r r rn)srnc@seZdZdZeZddZdS)ForkServerContextrEcCstjstddS)Nz%forkserver start method not available)rrbrH)rr r r rI0sz"ForkServerContext._check_availableN)rrrrKrlrVrIr r r r ro-sro)rar;rErac@seZdZdZeddZdS)rkr;cCsddlm}||S)Nr)rj)Zpopen_spawn_win32rj)rYrjr r r rX?s zSpawnProcess._PopenN)rrrrZrSrXr r r r rk=sc@seZdZdZeZdS)rnr;N)rrrrKrkrVr r r r rnDsr;cCst|t_dS)N)rFrWr\)rJr r r _force_start_methodQsrpcCs ttddS)Nspawning_popen)r:_tlsr r r r get_spawning_popenZsrscCs |t_dS)N)rrrq)popenr r r set_spawning_popen]srucCs tdkrtdt|jdS)NzF%s objects should only be shared between processes through inheritance)rsr`typer)objr r r assert_spawning`s rx)!rr8Z threadingr@rr__all__ Exceptionrr r r objectrZ BaseProcessrVr[dirr9rirkrlrmrnrorFrWrpZlocalrrrsrurxr r r r sD  >'