
    0Fie(                        d dl mZ d dlZd dlZd dl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  ej        e          Z G d de          ZdS )    )annotationsN)	CPU_COUNT)get_template)SpecCluster)nprocesses_nthreads)Nanny)	Scheduler)Security)Worker)parse_memory_limitc                  p     e Zd ZdZdddddddddej        ddddddddddddddf fd	Zd Zd
 fd		Z xZ	S )LocalClusteruy  Create local Scheduler and Workers

    This creates a "cluster" of a scheduler and workers running on the local
    machine.

    Parameters
    ----------
    n_workers: int
        Number of workers to start
    memory_limit: str, float, int, or None, default "auto"
        Sets the memory limit *per worker*.

        Notes regarding argument data type:

        * If None or 0, no limit is applied.
        * If "auto", the total system memory is split evenly between the workers.
        * If a float, that fraction of the system memory is used *per worker*.
        * If a string giving a number of bytes (like ``"1GiB"``), that amount is used *per worker*.
        * If an int, that number of bytes is used *per worker*.

        Note that the limit will only be enforced when ``processes=True``, and the limit is only
        enforced on a best-effort basis — it's still possible for workers to exceed this limit.
    processes: bool
        Whether to use processes (True) or threads (False).  Defaults to True, unless
        worker_class=Worker, in which case it defaults to False.
    threads_per_worker: int
        Number of threads per each worker
    scheduler_port: int
        Port of the scheduler. Use 0 to choose a random port (default). 8786 is a common choice.
    silence_logs: logging level
        Level of logs to print out to stdout.  ``logging.WARN`` by default.
        Use a falsey value like False or None for no change.
    host: string
        Host address on which the scheduler will listen, defaults to only localhost
    ip: string
        Deprecated.  See ``host`` above.
    dashboard_address: str
        Address on which to listen for the Bokeh diagnostics server like
        'localhost:8787' or '0.0.0.0:8787'.  Defaults to ':8787'.
        Set to ``None`` to disable the dashboard.
        Use ':0' for a random port.
    worker_dashboard_address: str
        Address on which to listen for the Bokeh worker diagnostics server like
        'localhost:8787' or '0.0.0.0:8787'.  Defaults to None which disables the dashboard.
        Use ':0' for a random port.
    diagnostics_port: int
        Deprecated.  See dashboard_address.
    asynchronous: bool (False by default)
        Set to True if using this cluster within async/await functions or within
        Tornado gen.coroutines.  This should remain False for normal use.
    blocked_handlers: List[str]
        A list of strings specifying a blocklist of handlers to disallow on the
        Scheduler, like ``['feed', 'run_function']``
    service_kwargs: Dict[str, Dict]
        Extra keywords to hand to the running services
    security : Security or bool, optional
        Configures communication security in this cluster. Can be a security
        object, or True. If True, temporary self-signed credentials will
        be created automatically.
    protocol: str (optional)
        Protocol to use like ``tcp://``, ``tls://``, ``inproc://``
        This defaults to sensible choice given other keyword arguments like
        ``processes`` and ``security``
    interface: str (optional)
        Network interface to use.  Defaults to lo/localhost
    worker_class: Worker
        Worker class used to instantiate workers from. Defaults to Worker if
        processes=False and Nanny if processes=True or omitted.
    **worker_kwargs:
        Extra worker arguments. Any additional keyword arguments will be passed
        to the ``Worker`` class constructor.

    Examples
    --------
    >>> cluster = LocalCluster()  # Create a local cluster  # doctest: +SKIP
    >>> cluster  # doctest: +SKIP
    LocalCluster("127.0.0.1:8786", workers=8, threads=8)

    >>> c = Client(cluster)  # connect to local cluster  # doctest: +SKIP

    Scale the cluster to three workers

    >>> cluster.scale(3)  # doctest: +SKIP

    Pass extra keyword arguments to Bokeh

    >>> LocalCluster(service_kwargs={'dashboard': {'prefix': '/foo'}})  # doctest: +SKIP
    Nr   z:8787F   c                0   ||}|t          j        d           |}|dk    rt          j        d           d }d|v rt          j        d           ||d u pt          |t                    }||rt          nt          }d | _        || _        |t                      }n<|du rt          j                    }n$t          |t                    st          d          |<|r d|v r|                    d          d         }n|r
|j        rd	}n| j        s|	sd
}nd}|                    d          s|dz   }||                    d          s|sd}|pi }|pi }|||rt                      \  }}n	d}t           }|||rt#          dt           |z            nd}|r9|7t#          dt%          t'          j        t           |z                                }|rd|vrt+          dd|t,                    |d<   |                    |||||d u||||
d	           t0          t3          j        t7          |||||	|||d u||
  
        |pi           d}||dfdt9          |          D             }t;                                          ||||||
||	  	         d S )NzMdiagnostics_port has been deprecated. Please use `dashboard_address=` insteadr   z_Setting `threads_per_worker` to 0 has been deprecated. Please set to None or to a specific int.	dashboardzSetting `dashboard` is discouraged. Please set `dashboard_address` to affect the scheduler (more common) and `worker_dashboard_address` for the worker (less common).Tz"security must be a Security objectz://ztls://z	inproc://ztcp://inprocz	127.0.0.1r   memory_limitauto)logger)	hostnthreadsservicesdashboard_addressr   	interfaceprotocolsecuritysilence_logs)
r   r   service_kwargsr   portr   r   r   r   blocked_handlers)clsoptionsc                    i | ]}|S  r$   ).0iworkers     8lib/python3.11/site-packages/distributed/deploy/local.py
<dictcomp>z)LocalCluster.__init__.<locals>.<dictcomp>   s    7771f777    )	name	schedulerworkersr'   loopasynchronousr   r   scheduler_sync_interval)warningswarn
issubclassr   r   status	processesr
   	temporary
isinstance	TypeErrorsplitrequire_encryptionendswith
startswithr   r   maxintmathceilr   r   updater	   toolzmergedictrangesuper__init__)selfr+   	n_workersthreads_per_workerr5   r.   startr   ipscheduler_portr   r   worker_dashboard_addressdiagnostics_portr   worker_servicesr   r/   r   r   r    r   worker_classscheduler_kwargsr0   worker_kwargsr,   r-   r'   	__class__s                               @r(   rG   zLocalCluster.__init__q   s   8 > D'M:   !1""M;   "&-''MO   $,O
<0O0OI$-9556L"zzHH)++HHHh// 	B@AAA $::e,,Q/ $h9 $#^ $N $&#  '' 	(%'H< 3 3H = =<i<D>r)/R!3!; /0C0E0E-	--	%."!3!?CLSAy,>>???RSI 	O+3!$QDIi)6K,L,L(M(M!N!N 	}<<,>9V- - -M.) 	.+%=5TA&$$ ,
 
	
 	
 	
 {%#1%''%/t;&7%5   !&B 
 
	& &-@@7777eI&6&6777%%$; 	 
	
 
	
 
	
 
	
 
	
r*   c                     t          d          )NzdThe `cluster.start_worker` function has been removed. Please see the `cluster.scale` method instead.)NotImplementedError)rH   argskwargss      r(   start_workerzLocalCluster.start_worker	  s    !=
 
 	
r*   c                    t          d                              | j        j        | j        |          }t                                          |          S )Nzlocal_cluster.html.j2)r4   r5   cluster_status)r[   )r   renderr4   r+   r5   rF   _repr_html_)rH   r[   rT   s     r(   r]   zLocalCluster._repr_html_  sT    %&=>>EE;#n) F 
 

 ww""."AAAr*   )N)
__name__
__module____qualname____doc__loggingWARNrG   rY   r]   __classcell__)rT   s   @r(   r   r      s        W Wv \!!% !3V
 V
 V
 V
 V
 V
p
 
 
B B B B B B B B B Br*   r   )
__future__r   rb   r?   r1   rB   dask.systemr   dask.widgetsr   distributed.deploy.specr   distributed.deploy.utilsr   distributed.nannyr   distributed.schedulerr	   distributed.securityr
   distributed.workerr   distributed.worker_memoryr   	getLoggerr^   r   r   r$   r*   r(   <module>rp      s7   " " " " " "     ! ! ! ! ! ! % % % % % % / / / / / / 8 8 8 8 8 8 # # # # # # + + + + + + ) ) ) ) ) ) % % % % % % 8 8 8 8 8 8		8	$	$~B ~B ~B ~B ~B; ~B ~B ~B ~B ~Br*   