U
    /eI9                     @  sD  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mZ d dl	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mZ d d	lmZmZmZmZ d d
lmZmZmZ d dlmZ d dl m!Z!m"Z" e#e$Z%dd Z&G dd dZ'G dd de'Z(G dd de'Z)G dd dZ*G dd de*Z+ddddddZ,dS )    )annotationsN)suppress)default_timer)valmap)IOLoop)	key_split)default_client
futures_of)CommClosedErrorclean_exceptioncoerce_to_addressconnect)MultiProgressProgressformat_time)dumps)
LoopRunner	is_kernelc                 C  s   | d krt  jjS t| S N)r   	scheduleraddressr   )r    r   G/tmp/pip-unpacked-wheel-g426oqom/distributed/diagnostics/progressbar.pyget_scheduler   s    
r   c                   @  s:   e Zd ZdddZedd Zdd	 Zd
d Zdd ZdS )ProgressBarN100msTc                 C  sj   t || _d | _|D ] }t|drt|j| _ q6qdd |D | _tjj	|dd| _
|| _t | _d S )Nclientc                 S  s    h | ]}t |d r|jn|qS keyhasattrr   .0kr   r   r   	<setcomp>/   s     z'ProgressBar.__init__.<locals>.<setcomp>s)default)r   r   r   r    weakrefrefkeysdaskutilsZparse_timedeltaintervalcompleter   _start_time)selfr)   r   r,   r-   r   r   r   r   __init__&   s    

zProgressBar.__init__c                 C  s   t  | j S r   r   r.   r/   r   r   r   elapsed4   s    zProgressBar.elapsedc                   s(  | j  | j fdd}dd }t| jf| jr:|  jni I d H | _td | jj	dt
|t
|| jd| jr~|  jnd dI d H  z(| jj| jr|  jnd d	I d H }W n tk
r   Y qY nX || _|d
 | _| jf | |d
 dkr| j I d H  | jf | qqtd d S )Nc                   s    t |  d}| I d H  |S )N)r-   )r   setupr   pr-   r)   r   r   r4   <   s    z!ProgressBar.listen.<locals>.setupc                 S  s4   t |jt |j|jd}|jdkr0||j |S N)all	remainingstatuserror)lenall_keysr)   r;   updateextrar   r6   resultr   r   r   functionA   s    
z$ProgressBar.listen.<locals>.function"Progressbar Connected to schedulerfeedopr4   rC   r,   )ZserializersZdeserializersr;   r<   finished'Progressbar disconnected from scheduler)r-   r)   r   r   r   connection_argscommloggerdebugwriter   r,   Z_serializersread_deserializersr
   _last_responser;   	_draw_barclose
_draw_stopr/   r4   rC   responser   r7   r   listen8   s@    


zProgressBar.listenc                 K  s   d S r   r   r/   kwargsr   r   r   rV   k   s    zProgressBar._draw_stopc              	   C  s"   t t | j  W 5 Q R X d S r   r   AttributeErrorrM   abortr2   r   r   r   __del__n   s    
zProgressBar.__del__)Nr   T)	__name__
__module____qualname__r0   propertyr3   rY   rV   r_   r   r   r   r   r   %   s   

3r   c                      sd   e Zd ZU dZded< d fdd	Zedd	d
dZejdddddZdd Z	dd Z
  ZS )TextProgressBarNzIOLoop | None_TextProgressBar__loopr   (   Tc           
        s<   t |d | _}	t |||| || _|r8|	| j d S )N)loop)r   _loop_runnersuperr0   widthZrun_syncrY   )
r/   r)   r   r,   rj   rg   r-   startr[   Zloop_runner	__class__r   r   r0   v   s
    zTextProgressBar.__init__)returnc                 C  s    | j }|d kr| jj | _ }|S r   )re   rh   rg   )r/   rg   r   r   r   rg      s    zTextProgressBar.loopr   None)valuern   c                 C  s   t jdtdd || _d S )Nz'setting the loop property is deprecated   )
stacklevel)warningswarnDeprecationWarningre   )r/   rp   r   r   r   rg      s      c           	   	   K  s|   |rd||  nd}dt | j|  }t d| }t| j}d|| j||}tt tj	| tj
  W 5 Q R X d S )N         ?#d   z"[{0:<{1}}] | {2}% Completed | {3})intrj   r   r3   formatr   
ValueErrorsysstdoutrP   flush)	r/   r:   r9   r[   fracbarpercentr3   msgr   r   r   rT      s    
   
zTextProgressBar._draw_barc                 K  s   t jd t j  d S )Nz[2K)r}   r~   rP   r   rZ   r   r   r   rV      s    zTextProgressBar._draw_stop)Nr   rf   NTT)r`   ra   rb   re   __annotations__r0   rc   rg   setterrT   rV   __classcell__r   r   rl   r   rd   s   s   
      
rd   c                      s<   e Zd ZdZd fdd	Zdd Zdd	d
Zdd Z  ZS )ProgressWidgetzProgressBar that uses an IPython ProgressBar widget for the notebook

    See Also
    --------
    progress: User function
    TextProgressBar: Text version suitable for the console
    Nr   Fc                   sv   t  |||| ddlm}m}m}	m}
 |d| _|dddd| _|d| _	|	| j	| jg| _
|
| j| j
g| _d S )Nr   HTMLFloatProgressHBoxVBox rv   minmaxdescription)ri   r0   
ipywidgetsr   r   r   r   elapsed_timer   bar_textZ
bar_widgetwidget)r/   r)   r   r,   r-   rg   r[   r   r   r   r   rl   r   r   r0      s    	

zProgressWidget.__init__c                 K  s.   t  | j ddlm} || jf| d S Nr   )displayr   currentZadd_callbackrY   ZIPython.displayr   r   r/   r[   r   r   r   r   _ipython_display_   s    z ProgressWidget._ipython_display_c                 K  sl   |dkrFt |\}}}d| j_dt| d t| j d d | j_n"|shd| j_dt| j d | j_d S )	Nr<   danger=<div style="padding: 0px 10px 5px 10px"><b>Exception</b> <tt></tt>: </div>success9<div style="padding: 0px 10px 5px 10px"><b>Finished:</b> )r   r   	bar_stylereprr   r3   r   rp   )r/   r:   r;   	exceptionr[   _r   r   r   rV      s.    	zProgressWidget._draw_stopc                 K  sF   || }dt | j d | j_|r*|| nd| j_d||f | j_d S )N:<div style="padding: 0px 10px 5px 10px"><b>Computing:</b> r   rw   zH<div style="padding: 0px 10px 0px 10px; text-align:right;">%d / %d</div>)r   r3   r   rp   r   r   )r/   r:   r9   r[   ndoner   r   r   rT      s    zProgressWidget._draw_bar)Nr   FN)N)	r`   ra   rb   __doc__r0   r   rV   rT   r   r   r   rl   r   r      s       
r   c                   @  sB   e Zd ZdeddfddZedd Zdd	 Zd
d Zdd Z	dS )MultiProgressBarNr   Fc                 K  sd   t || _d | _|D ] }t|drt|j| _ q6qdd |D | _|| _|| _|| _	t
 | _d S )Nr   c                 S  s    h | ]}t |d r|jn|qS r   r   r!   r   r   r   r$     s     z,MultiProgressBar.__init__.<locals>.<setcomp>)r   r   r   r    r'   r(   r)   funcr,   r-   r   r.   )r/   r)   r   r   r,   r-   r[   r   r   r   r   r0      s    	

zMultiProgressBar.__init__c                 C  s   t  | j S r   r1   r2   r   r   r   r3   	  s    zMultiProgressBar.elapsedc                   s   | j  | j| j fdd}dd }t| jf| jrB|  jni I d H | _t	d | j
dt|t|| jdI d H  | jj| jr|  jnd dI d H }|| _|d	 | _| jf | |d	 d
kr| j I d H  | jf | qqt	d d S )Nc                   s"   t |  d}| I d H  |S )N)r-   r   )r   r4   r5   r-   r   r)   r   r   r4     s    z&MultiProgressBar.listen.<locals>.setupc                 S  s8   t t|jt t|j|jd}|jdkr4||j |S r8   )r   r=   r>   r)   r;   r?   r@   rA   r   r   r   rC     s    


z)MultiProgressBar.listen.<locals>.functionrD   rE   rF   rH   r;   rI   rK   )r-   r)   r   r   r   r   rL   rM   rN   rO   rP   r   r,   rQ   rR   rS   r;   rT   rU   rV   rW   r   r   r   rY     s:    




zMultiProgressBar.listenc                 K  s   d S r   r   rZ   r   r   r   rV   <  s    zMultiProgressBar._draw_stopc              	   C  s"   t t | j  W 5 Q R X d S r   r\   r2   r   r   r   r_   ?  s    
zMultiProgressBar.__del__)
r`   ra   rb   r   r0   rc   r3   rY   rV   r_   r   r   r   r   r      s   

/r   c                      sN   e Zd ZdZdddedf fdd	Zdd	 Zd
d ZdddZdd Z	  Z
S )MultiProgressWidgetaT  Multiple progress bar Widget suitable for the notebook

    Displays multiple progress bars for a computation, split on computation
    type.

    See Also
    --------
    progress: User-level function <--- use this
    MultiProgress: Non-visualization component that contains most logic
    ProgressWidget: Single progress bar widget
    Nr   g?Fc           	        s.   t  ||||| ddlm} |g | _d S )Nr   )r   )ri   r0   r   r   r   )	r/   r)   r   Zminimumr,   r   r-   r[   r   rl   r   r   r0   Q  s    
zMultiProgressWidget.__init__c                   s   ddl mm mm} d_ fdd|D _fdd|D _fdd|D _dd	 }d
d t	|
 |ddD }|fdd|D _jjfj_d S )Nr   r   r   c                   s   i | ]}| d dddqS )r   rv   r   r   r   r"   r   )r   r   r   
<dictcomp>d  s      z3MultiProgressWidget.make_widget.<locals>.<dictcomp>c                   s   i | ]}| d qS )r   r   r   r   r   r   r   e  s      c              
     s6   i | ].}| d t t|tr$| n| d qS )zQ<div style="padding: 0px 10px 0px 10px; text-align:left; word-wrap: break-word;">r   )htmlescape
isinstancebytesdecoder   r   r   r   r   f  s    c                 S  s   | ddd S )z0Order keys by most numerous, then by string nameNr   )kvr   r   r   keyfuncq  s    z0MultiProgressWidget.make_widget.<locals>.keyfuncc                 S  s   g | ]\}}|qS r   r   )r"   r#   vr   r   r   
<listcomp>u  s     z3MultiProgressWidget.make_widget.<locals>.<listcomp>T)r   reversec                   s,   g | ]$} j | j| j| gqS r   )	bar_textsbars
bar_labelsr   )r   r/   r   r   r   x  s   )r   r   r   r   r   r   r   r   r   sorteditemsZbar_widgetsr   children)r/   r9   r   r   Z	key_orderr   )r   r   r   r/   r   make_widget`  s    

zMultiProgressWidget.make_widgetc                 K  s.   t  | j ddlm} || jf| d S r   r   r   r   r   r   r     s    z%MultiProgressWidget._ipython_display_c           	      K  s   |  D ]&\}}|s"d| j| _qd| j| _q|dkrnt|\}}}dt| d t| j d d | j_ndt| j d | j_d S )	Nr   r   r<   r   r   r   r   r   )	r   r   r   r   r   r   r3   r   rp   )	r/   r:   r;   r   r   r[   r#   r   r   r   r   r   rV     s0    zMultiProgressWidget._draw_stopc                 K  s|   | j r| jjs| | | D ]V\}}|||  }dt| j d | j_|rV|| nd| j	| _d||f | j
| _q d S )Nr   r   rw   zH<div style="padding: 0px 10px 0px 10px; text-align: right">%d / %d</div>)r)   r   r   r   r   r   r3   r   rp   r   r   )r/   r:   r9   r;   r[   r#   Zntasksr   r   r   r   rT     s    
zMultiProgressWidget._draw_bar)NN)r`   ra   rb   r   r   r0   r   r   rV   rT   r   r   r   rl   r   r   D  s   
r   T)notebookmultir-   c                 O  sx   t |}t|ttfs|g}| dkr*t } | r`|rHt|fd|i|}nt|fd|i|}|S t|fd|i| dS )a  Track progress of futures

    This operates differently in the notebook and the console

    *  Notebook:  This returns immediately, leaving an IPython widget on screen
    *  Console:  This blocks until the computation completes

    Parameters
    ----------
    futures : Futures
        A list of futures or keys to track
    notebook : bool (optional)
        Running in the notebook or not (defaults to guess)
    multi : bool (optional)
        Track different functions independently (defaults to True)
    complete : bool (optional)
        Track all keys (True) or only keys that have not yet run (False)
        (defaults to True)

    Notes
    -----
    In the notebook, the output of `progress` must be the last statement
    in the cell. Typically, this means calling `progress` at the end of a
    cell.

    Examples
    --------
    >>> progress(futures)  # doctest: +SKIP
    [########################################] | 100% Completed |  1.7s
    Nr-   )r	   r   setlistr   r   r   rd   )r   r   r-   Zfuturesr[   r   r   r   r   progress  s    r   )-
__future__r   r   loggingr}   rs   r'   
contextlibr   Ztimeitr   Ztlzr   Ztornado.ioloopr   r*   Z
dask.utilsr   Zdistributed.clientr   r	   Zdistributed.corer
   r   r   r   Z distributed.diagnostics.progressr   r   r   Zdistributed.protocol.pickler   Zdistributed.utilsr   r   	getLoggerr`   rN   r   r   rd   r   r   r   r   r   r   r   r   <module>   s0   
N8FSl