
    ԋgފ                    R   d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlmZmZ d dlmZ d dlmZ d dlmZmZmZ d dlmZ d dlmZ d dlZd d	lmZ d d
l m!Z! d dl"m#Z# d dl$m%Z% d dl&m'Z' d dl(m)Z) d dl*m+Z+ d dl,m-Z- d dl.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5 d dl6m7Z7m8Z8 d dl9m:Z: d dl;m<Z< d dl=m>Z> d dl?m@Z@ d dlAmBZB d dlCmDZD d dlEmFZF d dlGmHZHmIZImJZJmKZKmLZLmMZMmNZN d dlOmPZPmQZQ d dlRmSZSmTZTmUZU  ej                  eW      ZX G d de<      ZY G d d       ZZd"d!Z[y)#    )annotationsN)Callable
Collection)isawaitable)Empty)ClassVarLiteralcast)merge)IOLoop)	CPU_COUNT)parse_timedelta)
preloading)AsyncTaskGroupClosedError)get_address_host)address_from_user_args)asyncio_run)get_loop_factory)CommClosedErrorErrorMessage	OKMessage	RPCClosedStatuscoerce_to_addresserror_message)NannyPlugin_get_plugin_name)time)
ServerNode)AsyncProcess)enable_proctitle_on_children)pickle)_is_dumpable)Security)get_ipget_mp_contextjson_load_robust
log_errorsparse_portssilence_logging_cmgrwait_for)Workerrun) DeprecatedMemoryManagerAttributeDeprecatedMemoryMonitorNannyMemoryManagerc                      e Zd ZU dZ ej
                         Zded<   ded<   ded<   ded	<   ded
<   ded<   ded<   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d#	 	 	 d$ fdZ e	       Z
 e	       Z e       Zd Zd%dZed        Zed        Z fdZd&d'dZd(dZe	 d)	 	 	 	 	 d*d       Zed+d       Z	 d,	 	 	 	 	 d-dZd Zd Zd Zed        Zed        Zd Zd.d/dZ 	 d0	 	 	 	 	 d1 fd Z!d! Z"d" Z# xZ$S )2NannyaV  A process to manage worker processes

    The nanny spins up Worker processes, watches them, and kills or restarts
    them as necessary. It is necessary if you want to use the
    ``Client.restart`` method, or to restart the worker automatically if
    it gets to the terminate fraction of its memory limit.

    The parameters for the Nanny are mostly the same as those for the Worker
    with exceptions listed below.

    Parameters
    ----------
    env: dict, optional
        Environment variables set at time of Nanny initialization will be
        ensured to be set in the Worker process as well. This argument allows to
        overwrite or otherwise set environment variables for the Worker. It is
        also possible to set environment variables using the option
        ``distributed.nanny.environ``. Precedence as follows

            1. Nanny arguments
            2. Existing environment variables
            3. Dask configuration

        .. note::
           Some environment variables, like ``OMP_NUM_THREADS``, must be set before
           importing numpy to have effect. Others, like ``MALLOC_TRIM_THRESHOLD_`` (see
           :ref:`memtrim`), must be set before starting the Linux process. Such
           variables would be ineffective if set here or in
           ``distributed.nanny.environ``; they must be set in
           ``distributed.nanny.pre-spawn-environ`` so that they are set before spawning
           the subprocess, even if this means poisoning the process running the Nanny.

           For the same reason, be warned that changing
           ``distributed.worker.multiprocessing-method`` from ``spawn`` to ``fork`` or
           ``forkserver`` may inhibit some environment variables; if you do, you should
           set the variables yourself in the shell before you start ``dask-worker``.

    See Also
    --------
    Worker
    z ClassVar[weakref.WeakSet[Nanny]]
_instanceszWorkerProcess | Noneprocessr0   memory_managerdict[str, str]envpre_spawn_env"int | str | Collection[int] | None_given_worker_port_start_portc                l
   |t        j                  dt        d       t        j                         x| _        } d | _        | j                  t               t        j                         x| _        | _        t        |t              rt        di |}|xs
 t               | _        t        | j                   t              sJ | j                   j#                  d      | _        || _        | j&                  $t(        j*                  j-                  d      | _        || _        | j.                  $t(        j*                  j-                  d      | _        |t(        j*                  j-                  d      }|t(        j*                  j-                  d      }| j0                  | j2                  | j4                  | j6                  | j8                  | j:                  | j<                  | j>                  | j@                  d		}!tB        &|   |!| j$                  |d
       tG        jH                  | ||| jJ                        | _&        tO        |      | _(        |r"tS        || jP                        }"|"d   | _*        nk|Dt(        j*                  j-                  d      r%t(        j*                  j-                  d      | _*        n%|tW        |      | _*        ntW        ||f      | _*        |.| jT                  jY                  d      }#t[        |#      dk(  r|#d   }|| _.        |xs t^        | _0        || _1        || _2        || _3        |th        n|| _4        tk        d      | _6        | jl                  j-                  d      dv r| jl                  jo                  ddi       tq        | jl                  tk        d      |r-|js                         D $%ci c]  \  }$}%|$tu        |%       c}%}$ni       | _;        tq        t(        j*                  j*                  |xs i       | _        |jo                  ||||d       || _<        || _=        || _>        |	| _?        || _@        |r| j                  t        |             || _C        i | _D        | j                  | jT                        | _F        t        | |
      | _H        |sE|sC| jT                  j                  d      s(t        t        | j                  j                              }|| _M        || _N        || _O        || _P        || _Q        t        j                  j                  |        y c c}%}$w )Nz|the `loop` kwarg to `Nanny` is ignored, and will be removed in a future release. The Nanny always binds to the current loop.   
stacklevelworkerzdistributed.worker.preloadzdistributed.worker.preload-argvzdistributed.nanny.preloadzdistributed.nanny.preload-argv)	instantiatekillrestartget_logs	terminateclose_gracefullyr-   
plugin_addplugin_removeF)handlersconnection_argslocal_directoryneeds_workdir)file_dirtimeoutaddresszscheduler-addressz://r   z#distributed.nanny.pre-spawn-environPYTHONHASHSEED)N06640zdistributed.nanny.environ)port	interfaceprotocolhost)level)memory_limitz	inproc:// )UwarningswarnDeprecationWarning
contextlib	ExitStack_Nanny__exit_stackr4   _setup_loggingloggerr   currentloopio_loop
isinstancedictr$   securityget_connection_argsrJ   preloaddaskconfiggetpreload_argvrA   rB   rC   rD   closerF   r-   rG   rH   super__init__r   process_preloadsrK   preloadsr   death_timeoutr'   scheduler_addrr   splitlenr:   r   nthreads	reconnectvalidate	resourcesr,   _get_env_variablesr8   updater   itemsstrr7   worker_kwargscontact_addressservicesnamequietenter_contextr*   silence_logspluginsrpc	schedulerr0   r5   
startswithr%   r   rP   r;   _start_host
_interface	_protocol_listen_addressr2   r3   add)'selfscheduler_ipscheduler_portscheduler_fileworker_portrx   rd   rK   r   r   rY   ry   rz   r   r{   r   rt   rj   rn   preload_nannypreload_nanny_argvrh   r   listen_addressworker_classr7   rU   rW   rT   rV   rl   r   stackrI   cfgprotocol_addresskv	__class__s'                                         1lib/python3.12/site-packages/distributed/nanny.pyrq   zNanny.__init__{   sn   D MM>"	 %/$8$8$::EF##)>>#33	DLh%+(+H .HJ$--222#}}@@J<<;;??+GHDL($ $0Q RD  KKOO,GHM%!%1Q!R  ++II|| $ 5 588//!//
 	 00+	 	 	
 #33-!3d>R>R
 -];">4;M;MNC"%i.D!dkkoo6I&J"&++//2E"FD#"3L"AD"3\>4R"SD#2288?#$)+A."-%2" " , 4f,/0UV !!"23{B %%'7&@A:;36399;/;41aQAY;/B
 DKK.."=#&$		
 +. 	
 4< HI(/1$"5"560LQ ''22;?*4>>+A+ABCD#!-T"S 0s   >T0c                8    d| j                   | j                  fz  S )Nz<Nanny: %s, threads: %d>)worker_addressrx   r   s    r   __repr__zNanny.__repr__&  s    )T-@-@$--,PPP    c                8  K   | j                   y | j                   j                  }|y 	 t        | j                  j	                  | j                  dt                      |       d {    y 7 # t        j                  t        t        t        f$ r Y y w xY ww)Nznanny-close-)rP   stimulus_id)r4   r   r+   r   
unregisterr   asyncioTimeoutErrorr   OSErrorr   )r   rO   r   s      r   _unregisterzNanny._unregister)  s     <<44!	)) //|DF8=T *  	   $$ow	J 		s:   'B?A1 )A/*A1 .B/A1 1#BBBBc                J    | j                   d S | j                   j                  S N)r4   r   r   s    r   r   zNanny.worker_address:  s     ||+tL1L1LLr   c                J    | j                   d S | j                   j                  S r   )r4   
worker_dirr   s    r   r   zNanny.worker_dir>  s     ||+tH1H1HHr   c                  K   t         |           d{    t        | j                        }|D ]w  }t	        | j
                  || j                  | j                  | j                        }	  | j                  |fi | j                  j                  d       d{    || _         n& t!        d| j
                   d| j                         t#        | j$                        | _        | j(                  j+                          d{    | j,                  j.                  }| j0                  j3                  |       d{   }d|_        	 |j7                  d| j$                  d	       d{    |j9                          d{   }	 |d
   j;                         D ]   \  }}	| j=                  |	|       d{    " t>        jA                  d| j$                         | jC                          d{   }
|
tD        jF                  k7  rtI        d      	 |j7                  ddi       d{    	 |jO                          d{    | jP                  sJ | jS                          | S 7 X7 # t        $ r7}t        |      dkD  r#|j                  t        j                  k(  rY d}~| d}~ww xY w7 7 y7 N7 97 7 7 # tJ        $ rJ 	 |j7                  ddi       d{  7   n# tL        $ r Y nw xY w| jO                  d       d{  7    w xY w7 # |jO                          d{  7   w xY ww)z0Start nanny, start local process, start watchingN)rW   rT   rU   rV   rh   r@      zCould not start Nanny on host z with port zNanny->Scheduler (registration)register_nanny)oprP   znanny-plugins)pluginr   z        Start Nanny at: %rz$Nanny failed to start worker processstatusokerrorznanny-start-failedreason)*rp   start_unsafer)   r;   r   r   r   r   rh   listenget_listen_args_start_addressr   rw   errno
EADDRINUSE
ValueErrorr   rP   iprs   startr   addrr   connectr   writereadr~   rG   rb   inforA   r   runningRuntimeError	Exceptionr   ro   r   start_periodic_callbacks)r   portsrT   start_addressesaddrcommmsgr   r   responser   s              r   r   zNanny.start_unsafeB  s     g"$$$D,,-D2%%//M!dkk!%)]]%B%B8%L   '4#' * 01A1A0B C!--.0 
 #4<<0mm!!#####XX%%e,,5		**$4NOOO		#C3$'$8$>$>$@LD&//d/CCC %A 8$,,G!%!1!1!33v~~-&'MNN . jj(D!1222**,""""%%'E 	%  u:>agg1A1A&A	  	$, P# D 4 3  **h%8999 ' jj(<j=== $**,sU  L?I-AL?-/I3I0I3!A&L?J68L? J9L?!L! .J</L! J?L! /K	 ;K<9K	 5K6"K	 L! /K0L! 5L?L	%L?0I33	J3<+J.'L?-J..J33L?9L?<L! ?L! K	 K	 L! 		LK0)K,*K0/L0	K<9L;K<<LLLL! L?!L<5L86L<<L?c                t   K   | j                   &| j                   j                  ||       d{    yy7 w)zKill the local worker process

        Blocks until both the process is down and the scheduler is properly
        informed
        N)r   rO   )r4   rB   )r   rO   r   s      r   rB   z
Nanny.kill  s7      <<#,,##67#CCC $Cs   -868c                  K   | j                   (t        | j                  | j                  | j                  | j
                  | j                  | j                  | j                  j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                   | j"                        }|j%                  | j&                         t)        || j                  | j*                  | j,                  | j.                  | j0                  | j2                        | _         | j                  r9	 t5        | j                   j7                         | j                         d{   }|S 	 | j                   j7                          d{   }|S 7 +# t8        j:                  $ rI t<        j?                  d| | j                         | jA                  | j                  d       d{  7    w xY w7 g# tB        $ r4 t<        j?                  dd	       | jA                  d
       d{  7    w xY ww)ztStart a local worker process

        Blocks until the process is up and the scheduler is properly informed
        N)r   rx   rK   r   nannyr   rY   r{   rz   r   rt   rj   rn   rh   r   )r   r   on_exitr@   r7   r8   rl   z1Timed out connecting Nanny '%s' to scheduler '%s'znanny-instantiate-timeoutrO   r   zFailed to start processTexc_infoznanny-instantiate-failedr   )"r4   rg   ru   rx   _original_local_dirr   rP   r   r5   rY   r{   rz   r   rt   rj   rn   rh   r   r}   r   WorkerProcess_on_worker_exit_syncr,   r7   r8   rl   r+   r   r   r   rb   r   ro   r   )r   r   results      r   rA   zNanny.instantiate  s    
 << !00 $ 8 8llYY!00==..!.."00!.. $ 4 4M"   !3!34(+!..11{{HH"00{{DL '(:(:(<d>P>PQQ& #||1133
 ' R'' 	G''
 jj ..7R !    	 4 6Fjj(BjCCCss   EI1F$ 6F"7F$ ;I>H HH  I"F$ $AH 8G;9H  IH 5I:H=;IIc                t  K   t        |t              rt        j                  |      }t        |t              st        j                  dt        d       t        t        |      }|t        |      }|sJ || j                  |<   t        j                  d|       t        |d      r(	 |j                  |       }t        |      r
| d {   }t'        |dd	      r| j)                  d
| d       d {    ddiS 7 3# t         $ r+}t        j#                  d|       t%        |      cY d }~S d }~ww xY w7 Aw)NzmRegistering duck-typed plugins has been deprecated. Please make sure your plugin inherits from `NannyPlugin`.r=   r>   zStarting Nanny plugin %ssetupr   zNanny plugin %s failed to setuprC   Fznanny-plugin-z-restartr   r   OK)rf   bytesr"   loadsr   r[   r\   r]   r
   r   r   rb   r   hasattrr   r   r   	exceptionr   getattrrC   )r   r   r   r   r   s        r   rG   zNanny.plugin_add  s     fe$\\&)F&+.MML"	 k6*<#F+Dt#T.567#(D1v&#)\F 69e,,,dV8&D,EEE$ * (  !BDI$Q''( FsT   B$D8'"C? 	C=
C? &D84D65D8=C? ?	D3 D.(D3)D8.D33D8c                V  K   t         j                  d|        	 | j                  j                  |      }t	        |d      r'|j                  |       }t        |      r
| d {   }ddiS 7 # t        $ r-}t         j                  d|       t        |      }|cY d }~S d }~ww xY ww)NzRemoving Nanny plugin teardownr   z"Nanny plugin %s failed to teardownr   r   )
rb   r   r   popr   r   r   r   r   r   )r   r   r   r   r   r   s         r   rH   zNanny.plugin_remove  s     ,TF34		\\%%d+Fvz*t4v&#)\F $ * 	A4H"CJ	sG   B)A	A0 %A.&A0 *B).A0 0	B&9"B!B&B)!B&&B)c                   K    fd}	 t        t        j                   |             |       d {    y7 # t        j                  $ r t        j                  d| d       Y yt        $ r}t        |      cY d }~S d }~ww xY ww)Nc                    K   j                   3j                          d {    j                          d {    y y 7 7 w)Nr   )r4   rB   rA   )r   r   s   r   _zNanny.restart.<locals>._  sC     ||'iivi...&&((( (.(s   "AAAAAAr   zRestart timed out after zs; returning before finishedz	timed out)r+   r   shieldr   rb   r   r   r   )r   rO   r   r   r   s   ` `  r   rC   zNanny.restart  s|     	)

	7>>!#.888  9## 	LL*7)3OP  	$ ##	$sI   B	'; 9; B	; ,B'B	)B1
B;B<B	BB	c                V    | j                   d uxr | j                   j                         S r   r4   is_aliver   s    r   r   zNanny.is_alive  #    ||4'CDLL,A,A,CCr   c                "    t        | |g|i |S r   )r-   )r   r   argskwargss       r   r-   z	Nanny.run  s    4////r   c                p    	 | j                   j                  | j                  |       y # t        $ r Y y w xY wr   )_ongoing_background_tasks	call_soon_on_worker_exitr   r   exitcodes     r   r   zNanny._on_worker_exit_sync  s7    	**44T5I5I8T%	 	s   &) 	55c                D  K   | j                   t        j                  t        j                  t        j                  t        j
                  t        j                  fvr	 | j                          d {    	 | j                   t        j                  t        j                  t        j
                  t        j                  fvr.t        j                  d       | j                          d {    y | j                   t        j
                  k(  r| j                  d       d {    y y 7 # t        $ rA t        j                  d       | j                  s| j                  d       d {  7   Y y Y w xY w7 7 W# t        $ r t        j!                  dd       Y y w xY ww)	NzFailed to unregisterznanny-unregister-failedr   zRestarting workernanny-close-gracefullyz1Failed to restart worker after its process exitedTr   )r   r   initclosingclosedclosing_gracefullyfailedr   r   rb   r   ry   ro   warningrA   r   r   r   s     r   r   zNanny._on_worker_exit   sH    ;;KKNNMM%%MM
 
&&(((	{{))	#  23&&((( 9 99jj(@jAAA :! )   !78~~**,E*FFF & )A 	LLCd  	s   AF D) 0D'1D) 6A2E: (E6)E: -F .2E:  E8!E: %F 'D) )?E3(E+)E3.F 2E33F 6E: 8E: : FF FF c                J    | j                   xr | j                   j                  S r   )r4   pidr   s    r   r  z	Nanny.pidB  s    ||0 0 00r   c                T    t        j                  dd        | j                  |i |S )Nz'Worker._close has moved to Worker.closer=   r>   )r[   r\   ro   )r   r   r   s      r   _closezNanny._closeF  s'    ?ANtzz4*6**r   c                p    t         j                  | _        t        j	                  d| j
                  |       y)z
        A signal that we shouldn't try to restart workers if they go away

        This is used as part of the cluster shutdown process.
        z*Closing Nanny gracefully at %r. Reason: %sN)r   r   r   rb   r   address_safe)r   r   s     r   rF   zNanny.close_gracefullyJ  s*     //8$:K:KV	
r   c                   K    j                   t        j                  k(  r7 j                          d{     j                   t        j                  k(  sJ  j                   t        j                  k(  ryt        j                   _         t
        j                  d j                  |        j                  j                          d{    t        j                   fd j                  D          d{     j                           j                   j                  ||       d{    d _         j                   j#                          d{    t        j                   _         t$         E          d{     j&                  j)                  ddd       t
        j                  d j                         y7 7 7 7 7 v7 Mw)z;
        Close the worker process, stop all comms.
        Nr   zClosing Nanny at %r. Reason: %sc              3  @   K   | ]  }j                  |        y wr   )rH   ).0r   r   s     r   	<genexpr>zNanny.close.<locals>.<genexpr>g  s     QLDt11$7Ls   r   zNanny at %r closed.)r   r   r   finishedr   rb   r   r  rs   r   r   gatherr   stopr4   rB   r   ro   rp   r`   __exit__)r   rO   r   r   s   `  r   ro   zNanny.closeU  sR     ;;&..(--/!!;;&--///;;&--'nn5t7H7H&Qmm$$&&&nnQDLLQRRR		<<#))GF);;;hhnnmmgmo""4t4)4+<+<=/ " 	'R < 	sk   1GGBG
G,G7G
86G.G/(GG*GGAGG
GGGGc                Z   K   | j                   j                  ||       d {    y 7 w)N)topicr   )r   	log_eventr   r  r   s      r   
_log_eventzNanny._log_eventu  s-     nn&& ' 
 	
 	
s   !+)+c                    t        |      st        dt        |      d      | j                  j	                  | j
                  ||       y)a  Log an event under a given topic

        Parameters
        ----------
        topic : str, list[str]
            Name of the topic under which to log an event. To log the same
            event under multiple topics, pass a list of topic names.
        msg
            Event message to log. Note this must be msgpack serializable.

        See also
        --------
        Client.log_event
        z4Message must be msgpack serializable. Got type(msg)=z	 instead.N)r#   	TypeErrortyper   r   r  r  s      r   r  zNanny.log_event{  sG     C GT#YL	R  	&&00%Mr   )NNNr   NNNNNautoTFFNNNNNNNNNNNNNNNNN)r   r9   rT   r9   )
   )   z
nanny-kill)rO   floatr   r   returnNoner  r   r   )r   zNannyPlugin | bytesr   z
str | Noner  ErrorMessage | OKMessage)r   r   r  r   )   znanny-restart)rO   r  r   r   r  z)Literal['OK', 'timed out'] | ErrorMessage)r   )r   r   r  r  )r  znanny-close)rO   r  r   r   r  zLiteral['OK'])%__name__
__module____qualname____doc__weakrefWeakSetr3   __annotations__rq   r.   rY   memory_terminate_fractionr/   memory_monitorr   r   propertyr   r   r   rB   rA   r(   rG   rH   rC   r   r-   r   r   r  r  rF   ro   r  r  __classcell__)r   s   @r   r2   r2   E   s   (T 4C7??3DJ0D!!&&	!! ;:33 :;37?d#
 8d#: 1;d#N 45L @ B,.NQ" M M I IEND7r >B  )  1;  	!     D      2A+.	2(D0  B 1 1+	
 1>*-	@
Nr   r2   c                      e Zd ZU ded<   ded<   ded<   ded<   ded<   d	Zd
 ZddZd Zd Zd Z	e
d        Zd Z	 	 	 d	 	 	 	 	 	 	 ddZd Ze	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd       Zy)r   zasyncio.Eventr   stoppedzAsyncProcess | Noner4   r6   r7   r8   g?c                   t         j                  | _        || _        || _        || _        d | _        || _        || _        || _	        |j                         | _        	 ddlm}  |        | j                  j                  dd        | j                  j                  dd        d | _        d | _        y # t        $ r Y w xY w)Nr   )default_clientr   shuffle)r   r   r   r   r   r   r4   r,   r7   r8   copyrl   distributed.clientr0  r   r   r   r   )	r   r   r   r   r@   r7   r8   rl   r0  s	            r   rq   zWorkerProcess.__init__  s     kk(**kkm	9KKOOK.KKOOIt,
 "  		s   AB1 1	B=<B=c                  K   t                | j                  t        j                  k(  r| j                  S | j                  t        j                  k(  r.| j                  j                          d{    | j                  S t               }|j                         | _        |j                         | _	        | j                  j                  d       | j                  j                          t        j                         j                  }t        t!        j"                  | j$                  | j&                  | j                  | j                  |t!        j"                  | j(                  fi | j*                  | j,                  | j.                        dt1                     | _        t4        j.                  j                  dd      | j2                  _        | j2                  j9                  | j:                         t=        j>                         | _        t=        j>                         | _         t        j                  | _        tB        jD                  jG                  | jH                         	 	 | j2                  jK                          d{    	 | jW                  |       d{   }	 | j                  j[                          |s| j                  S |d
   | _.        |d   | _/        | j\                  sJ t        j                  | _        | j                  S 7 7 # tL        $ rR tN        jQ                  dd	       | j2                  jS                          d{  7   t        jT                  | _        Y w xY w7 # tX        $ r: | j2                  jS                          d{  7   t        jT                  | _         w xY w# | j                  j[                          w xY ww)z7
        Ensure the worker process is started.
        N)r   init_result_qchild_stop_quidworker_factoryr7   rl   z Dask Worker process (from Nanny))targetr   r   zdistributed.worker.daemonT)defaultzNanny failed to start processr   rP   dir)0r!   r   r   r   startingwaitr&   Queuer5  r6  putrm   uuiduuid4hexr    	functoolspartial_runr   r,   r   r7   rl   rg   r4   rk   daemonset_exit_callback_on_exitr   Eventr.  osenvironr}   r8   r   r   rb   r   rE   r  _wait_until_connectedr   setr   r   )r   mp_ctxr7  r   s       r   r   zWorkerProcess.start  s     	%&;;&..(;;;;&//),,##%%%;;!#\\^"LLN 	d#jjl#$$		!.."00!..(00S@R@RSHH{{	 46
 #kkoo.ISWoX&&t}}5}}}}oo 	

$,,-	,ll((*** 66s;; LL;;!)ne*""""nn{{A &P + ,   !@4 Pll,,...$mm, < ll,,...$mm	 LLs   A.O0L1G6O)L LL M6  M4!M6 &A,OL =M1MM1.N< 0M11N< 4M6 6&N9NN99N< <OOc                B    || j                   ury | j                          y r   )r4   mark_stopped)r   procs     r   rH  zWorkerProcess._on_exit  s    t||#r   c                H    |J |dk(  rd|fz  S |dk\  rd||fz  S d|| fz  S )N   z.Worker process %d was killed by unknown signalr   z'Worker process %d exited with status %dz)Worker process %d was killed by signal %drZ   )r   r  r   s      r   _death_messagezWorkerProcess._death_message  sJ    ###s?CsfLL]<XNN>#yAQQQr   c                V    | j                   d uxr | j                   j                         S r   r   r   s    r   r   zWorkerProcess.is_alive  r   r   c                ~    | j                   r0| j                   j                         r| j                   j                  S d S r   )r4   r   r  r   s    r   r  zWorkerProcess.pid  s-    #'<<DLL4I4I4Kt||UQUUr   c                   | j                   t        j                  k7  r\| j                  J | j                  j                  }|J |dk7  r;| j                  | j                  j                  |      }t        j                  |       t        j                  | _         | j                  j                          | j                  j                          | j                  j                          d | _        d | _        d | _        | j                  rJt         j"                  j%                  | j                        r!t'        j(                  | j                  d       d | _        | j*                  | j+                  |       y y y )Nr   T)ignore_errors)r   r   r.  r4   r   rT  r  rb   r   r   clearrM  ro   r5  r6  r   rJ  pathexistsshutilrmtreer   )r   rr   s      r   rP  zWorkerProcess.mark_stopped  s   ;;&..(<<+++%%A= =Av))$,,*:*:A>C  ..DKLL LLLL !%D $DDL277>>$//#BdooTB"DO||'Q () )r   c                  K   t               |z   }| j                  t        j                  k(  r"| j                  j                          d{    | j                  t        j                  t        j                  t        j                  t        j                  t        j                  fv sJ | j                         | j                  t        j                  k(  ry| j                  t        j                  k(  r#| j                  j                          d{    yt        j                  | _        t        j                  d|       | j                  }|dz  }| j                  j                  d|||d       | j                  j                          |J 	 	 |j!                  |       d{    y7 c7 7 
# t"        j$                  $ r Y nw xY wt        j'                  d|dd       |j)                          d{  7   |j!                  t+        d	|t               z
               d{  7   y# t,        $ r}d
t/        |      v rY d}~y d}~ww xY ww)aX  
        Ensure the worker process is stopped, waiting at most
        ``timeout * 0.8`` seconds before killing it abruptly.

        When `kill` returns, the worker process has been joined.

        If the worker process does not terminate within ``timeout`` seconds,
        even after being killed, `asyncio.TimeoutError` is raised.
        Nz(Nanny asking worker to close. Reason: %sg?r  )r   rO   executor_waitr   z!Worker process still alive after z.1fz seconds, killingr   z(invalid operation on closed AsyncProcess)r   r   r   r<  r   r=  stoppingr.  r  r   rb   r   r4   r6  r?  ro   joinr   r   r  rB   maxr   r   )r   rO   r`  r   deadliner4   wait_timeoutr   s           r   rB   zWorkerProcess.kill6  s     6G#
 ;;&//),,##%%%{{OONNNNMM%%
 
 	 ;;	 
 ;;&..(;;&//),,##%%%oo>G,,}'!. 		
 	!"""	ll<000A & && 1''  NN3L3EEVW ,,.  ,,s1h&78999 	9SVC	s   AI
F-CIF0A?IF4 'F2(F4 ,I0I2F4 4G
H0 	G

0H0 :G=;.H0 )H,*H0 /I0	I9IIIIIc                  K   	 | j                   t        j                  k7  ry 	 | j                  j	                         }|d   |k7  rCd|v r|d   |S # t
        $ r+ t        j                  | j                         d {  7   Y w xY ww)Nr7  r   )	r   r   r<  r5  
get_nowaitr   r   sleep_init_msg_interval)r   r7  r   s      r   rL  z#WorkerProcess._wait_until_connectedy  s     {{foo-((335
 5zS c!+&&
  mmD$;$;<<<s3    BA B+B<A?=BBBBc                   dddd	 	 	 	 	 	 	 	 	 dddfddfd}t        j                         5 j                  dfd       }	t        j                  j                  |       t        j                  j                          t        j                  j                  |       d	d
l
m}
  |
        |rt        j                  |       t         |       t                      d d d        y # 1 sw Y   y xY w)Nr  Tzworkerprocess-stop)rO   r`  r   c                J   K   | j                  d|||       d {    y 7 w)NF)r   r`  rO   r   )ro   )r@   rO   r`  r   s       r   do_stopz#WorkerProcess._run.<locals>.do_stop  s/      ,,+	    s   #!#c                t   	 j                         }j                          |d   dk(  sJ |       |d=  | j                  fd|i| y# t        t        t        f$ r t        j                  d       ddi}Y gw xY w# j                          d   dk(  sJ |       |d=  | j                  fd|i| w xY w)zi
            Wait for an incoming stop message and then stop the
            worker cleanly.
            z Worker process died unexpectedlyr   r  r@   N)rm   r  r   EOFErrorrb   r   ro   add_callback)rd   r@   r   r6  rl  s      r   watch_stop_qz(WorkerProcess._run.<locals>.watch_stop_q  s    
	A"&&(
 ""$4yF*/C/*I!!!'@&@C@ w1 %?@Vn% ""$4yF*/C/*I!!!'@&@C@s#   A -A;8A> :A;;A> >9B7c                 p  K   d} 	         }d} t        j                  t        j                  |t	        j
                               dd      }|j                          j                  |j                  d       |4 d	{    d	} 	 |j                  sJ 	 j                  |j                  |j                  d
       j                          |j                          d	{    t        j                  d       d	d	d	      d	{    j'                          y	7 7 <# t         $ r Y 0w xY w7 (# 1 d	{  7  sw Y   8xY w# t"        $ rJ}|  t        j%                  d|  d       j                  |d       j                          Y d	}~d	}~ww xY w# j'                          w xY ww)zK
            Try to start worker and inform parent of outcome.
            
initializer   )r@   rd   zNanny stop queue watchT)r9  r   rF  r=   rN   N)rP   r;  r7  zWorker closedz
Failed to z worker)r7  r   )	threadingThreadrC  rD  r   rc   r   callbackrb  rP   r?  rK   ro   r  rb   r   r   r   r   join_thread)	failure_typer@   threadr   r5  r   r7  rp  r8  s	       r   r-   zWorkerProcess._run.<locals>.run  s     (4L(,')&"))$,,$%#^^-
 2 v{{A6!6#'L5%~~-~ &))+1>>'-'='='* &++-$oo///O4# "64 ))+5 "  0 &  "666$  &'  :l^7!CD!!#A">?##%%& ))+s   F6A<E D!E D6D%AD6&D#'D6 E D4E F6!E #D6%	D1.D60D11D64E 6E<D?=EE 	FA FF! FF! !F33F6c                     	  j                  ddi       	  j                           j                          y # t        $ r Y -w xY w# t        $ r Y +w xY w)Nr   r  )r?  r   ro   rv  )r6  s   r   close_stop_qz(WorkerProcess._run.<locals>.close_stop_q  s`     $$dF^4 &&( ((* " 
 " s    8 A 	AA	AAr   )default_initializer)loop_factory)
r@   r,   rO   r  r`  boolr   r   r  r  )rd   r   r@   r,   r  r  )r  r  )r^   r_   ru  rJ  rK  r}   rk   rl   refreshrM  dask.multiprocessingr{  rb   setLevelr   r   )clsr   r5  r6  r7  r7   rl   r8  r-   rz  r{  rl  r   rp  s     ```  `   @@@r   rE  zWorkerProcess._run  s     "&.		 	  		
 	 		A -	, -	,^ !!#u^^
+ 
+ JJc"KK!KKOOF#@!-,<,>?5 $##s   B0C88DNr  )r  Tzworkerprocess-kill)rO   r  r`  r}  r   r   r  r  )r   r}  r5  multiprocessing.Queuer6  r  r7  r   r7   rg   rl   rg   r8  zCallable[[], Worker]r  r  )r"  r#  r$  r(  ri  rq   r   rH  rT  r   r+  r  rP  rB   rL  classmethodrE  rZ   r   r   r   r     s     	!!  #DHTRD V V 4 "*	AA A 	A
 
AF( q@q@ -q@ ,	q@
 q@ q@ q@ -q@ 
q@ q@r   r   c                <   t         j                  j                  |       }t        |t              st        |  dt        |             |j                         D ci c]2  \  }}|	|t        j                  j                  |t        |            4 }}}|S c c}}w )Nz1 configuration must be of type dict. Instead got )rk   rl   rm   rf   rg   r  r  r~   rJ  rK  r   )
config_keyr   r   r   s       r   r|   r|     s    
++//*
%Cc4 lKDQTI;W
 	

 58IIK
QKDAq1=1bjjnnQA''KC
QJ Rs   
B',B)r  r   r  r6   )\
__future__r   r   r^   r   rC  loggingmultiprocessingrJ  r\  rs  r@  r[   r&  collections.abcr   r   inspectr   queuer   typingr   r	   r
   toolzr   tornado.ioloopr   rk   dask.systemr   
dask.utilsr   distributedr   distributed._async_taskgroupr   distributed.commr   distributed.comm.addressingr   distributed.compatibilityr   distributed.configr   distributed.corer   r   r   r   r   r   r   distributed.diagnostics.pluginr   r   distributed.metricsr   distributed.noder   distributed.processr    distributed.proctitler!   distributed.protocolr"   distributed.protocol.serializer#   distributed.securityr$   distributed.utilsr%   r&   r'   r(   r)   r*   r+   distributed.workerr,   r-   distributed.worker_memoryr.   r/   r0   	getLoggerr"  rb   r2   r   r|   rZ   r   r   <module>r     s    "       	      0   * *  !  ! & " B - > 1 /   I $ ' , > ' 7 )   +  
		8	$I	NJ I	NXn@ n@b	r   