a DOg+@sddlZddlZddlZddlmZddlmZdZGdddeZGdd d eZ Gd d d eZ Gd d d eZ Gddde Z GdddejZGddde ZejdkrRGdddejZGdddejZGdddejZGddde ZGddde ZGdd d e Zeeed!Zejd"krDeed#Zn eed$Zn8Gd%ddejZGd&dde Zd#eiZeed#Zd'd(ZeZd)d*Zd+d,Zd-d.ZdS)/N)process) reductionc@s eZdZdS) ProcessErrorN__name__ __module__ __qualname__rrr//usr/lib64/python3.9/multiprocessing/context.pyrsrc@s eZdZdS)BufferTooShortNrrrrr r sr c@s eZdZdS) TimeoutErrorNrrrrr r sr c@s eZdZdS)AuthenticationErrorNrrrrr rsrc@sXeZdZeZeZeZeZeej Z eej Z eej Z ddZ ddZ dCddZdd Zd d ZdDd dZdEddZdFddZddZdGddZdHddZdIddZddZdJd d!Zd"d#Zd$d%Zdd&d'd(Zdd&d)d*Zd+d,Zd-d.ZdKd/d0Z d1d2Z!d3d4Z"d5d6Z#dLd7d8Z$dMd:d;Z%dNdd?Z(e(j)d@d?Z(dAdBZ*d S)O BaseContextcCs"t}|durtdn|SdS)z(Returns the number of CPUs in the systemNzcannot determine number of cpus)os cpu_countNotImplementedError)selfnumrrr 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) SyncManagerctx)managersr get_contextstart)rrmrrr Manager1s zBaseContext.ManagerTcCsddlm}||S)z1Returns two connection object connected by a piper)Pipe) connectionr)rduplexrrrr r<s zBaseContext.PipecCsddlm}||dS)z#Returns a non-recursive lock objectr)Lockr) synchronizer r)rr rrr r As zBaseContext.LockcCsddlm}||dS)zReturns a recursive lock objectr)RLockr)r!r"r)rr"rrr r"Fs zBaseContext.RLockNcCsddlm}|||dS)zReturns a condition objectr) Conditionr)r!r#r)rlockr#rrr r#Ks zBaseContext.ConditionrcCsddlm}|||dS)zReturns a semaphore objectr) Semaphorer)r!r%r)rvaluer%rrr r%Ps zBaseContext.SemaphorecCsddlm}|||dS)z"Returns a bounded semaphore objectr)BoundedSemaphorer)r!r'r)rr&r'rrr r'Us zBaseContext.BoundedSemaphorecCsddlm}||dS)zReturns an event objectr)Eventr)r!r(r)rr(rrr r(Zs zBaseContext.EventcCs ddlm}|||||dS)zReturns a barrier objectr)Barrierr)r!r)r)rpartiesactiontimeoutr)rrr r)_s zBaseContext.BarrierrcCsddlm}|||dS)Returns a queue objectr)Queuer)queuesr.r)rmaxsizer.rrr r.ds zBaseContext.QueuecCsddlm}|||dS)r-r) JoinableQueuer)r/r1r)rr0r1rrr r1is zBaseContext.JoinableQueuecCsddlm}||dS)r-r) SimpleQueuer)r/r2r)rr2rrr r2ns zBaseContext.SimpleQueuercCs"ddlm}||||||dS)zReturns a process pool objectr)Pool)context)poolr3r)r processes initializerinitargsmaxtasksperchildr3rrr r3ss  zBaseContext.PoolcGsddlm}||g|RS)zReturns a shared objectr)RawValue) sharedctypesr:)rtypecode_or_typeargsr:rrr r:zs zBaseContext.RawValuecCsddlm}|||S)zReturns a shared arrayr)RawArray)r;r>)rr<size_or_initializerr>rrr r>s zBaseContext.RawArray)r$cGs(ddlm}||g|R||dS)z$Returns a synchronized shared objectr)Valuer$r)r;r@r)rr<r$r=r@rrr r@s zBaseContext.ValuecCs ddlm}|||||dS)z#Returns a synchronized shared arrayr)ArrayrA)r;rBr)rr<r?r$rBrrr rBs 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)sysplatformgetattrspawnrE)rrErrr rEs zBaseContext.freeze_supportcCsddlm}|S)zZReturn package logger -- if it does not already exist then it is created. r) get_logger)utilrJ)rrJrrr rJs zBaseContext.get_loggercCsddlm}||S)z8Turn on logging and add a handler which prints to stderrr) log_to_stderr)rKrL)rlevelrLrrr rLs zBaseContext.log_to_stderrcCsddlm}dS)zVInstall support for sending connections and sockets between processes r)rN)r)rrrrr 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)rIrP)r executablerPrrr rPs 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) forkserverrR)r module_namesrRrrr rRs z"BaseContext.set_forkserver_preloadcCsF|dur |Sz t|}Wn ty8td|dYn0||S)Nzcannot find context for %r)_concrete_contextsKeyError ValueError_check_available)rmethodrrrr rs  zBaseContext.get_contextFcCs|jSN)_namer allow_nonerrr get_start_methodszBaseContext.get_start_methodcCs tddS)Nz+cannot set start method of concrete context)rWrrYforcerrr 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)globalsgetrrrr reducerszBaseContext.reducercCs|td<dS)Nr)rb)rrrrr rescCsdSrZrrdrrr rXszBaseContext._check_available)T)N)r)r)NN)r)r)NNrN)N)N)F)F)+rr r rr r r staticmethodrcurrent_processparent_processactive_childrenrrrr r"r#r%r'r(r)r.r1r2r3r:r>r@rBrErJrLrOrPrRrr^rapropertyresetterrXrrrr rsR                rc@seZdZdZeddZdS)ProcessNcCstj|SrZ)_default_contextrrl_Popen) process_objrrr rnszProcess._Popenrr r _start_methodrfrnrrrr rlsrlcsFeZdZeZddZd fdd ZdddZdd d Zd d ZZ S)DefaultContextcCs||_d|_dSrZ)rm_actual_context)rr4rrr __init__szDefaultContext.__init__Ncs0|dur |jdur|j|_|jSt|SdSrZ)rsrmsuperr)rrY __class__rr rs  zDefaultContext.get_contextFcCs<|jdur|std|dur,|r,d|_dS|||_dS)Nzcontext has already been set)rs RuntimeErrorrr_rrr ras  zDefaultContext.set_start_methodcCs"|jdur|rdS|j|_|jjSrZ)rsrmr[r\rrr r^s  zDefaultContext.get_start_methodcCsBtjdkrdgStjdkr"ddgnddg}tjr:|d|SdS)NrCrIdarwinforkrS)rFrGrHAVE_SEND_HANDLEappend)rmethodsrrr get_all_start_methodss   z$DefaultContext.get_all_start_methods)N)F)F) rr r rlrtrrar^r~ __classcell__rrrvr rrs   rrrCc@seZdZdZeddZdS) ForkProcessrzcCsddlm}||SNr)Popen) popen_forkrrorrrr rns zForkProcess._PopenNrprrrr rsrc@seZdZdZeddZdS) SpawnProcessrIcCsddlm}||Sr)popen_spawn_posixrrrrr rns SpawnProcess._PopenNrprrrr rsrc@seZdZdZeddZdS)ForkServerProcessrScCsddlm}||Sr)popen_forkserverrrrrr rn s zForkServerProcess._PopenNrprrrr rsrc@seZdZdZeZdS) ForkContextrzN)rr r r[rrlrrrr r%src@seZdZdZeZdS SpawnContextrINrr r r[rrlrrrr r)src@seZdZdZeZddZdS)ForkServerContextrScCstjstddS)Nz%forkserver start method not available)rr{rWrdrrr rX0sz"ForkServerContext._check_availableN)rr r r[rrlrXrrrr r-sr)rzrIrSryrIrzc@seZdZdZeddZdS)rrIcCsddlm}||Sr)Zpopen_spawn_win32rrrrr rnDs rNrprrrr rBsc@seZdZdZeZdSrrrrrr rIscCst|t_dSrZ)rUrmrs)rYrrr _force_start_methodVsrcCs ttddS)Nspawning_popen)rH_tlsrrrr get_spawning_popen_srcCs |t_dSrZ)rr)popenrrr set_spawning_popenbsrcCs tdurtdt|jdS)NzF%s objects should only be shared between processes through inheritance)rrxtyper)objrrr assert_spawninges  r) rrF threadingrNrr__all__ Exceptionrr r robjectr BaseProcessrlrrrGrrrrrrrUrmrlocalrrrrrrrr sJ  ?,