o
    e~#gy                     @  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Zd dlZd dl	m
Z
 d dlmZ d dlmZmZm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 d d
lmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z% d dl&m'Z'm(Z(m)Z)m*Z*m+Z+ erd dl,m-Z-m.Z. G dd dZ/G dd dZ0G dd dZ1G dd dZdS )    )annotationsN)defaultdict)Queue)TYPE_CHECKINGLiteralcast)route_utilsroutes)PredictBodyInternal)TrackedIterable)
API_PREFIX)	EstimationMessageEventMessage
LogMessageProcessCompletedMessageProcessGeneratingMessageProcessStartsMessageProgressMessageProgressUnitServerMessage)LRUCacheerror_payloadrun_coro_in_backgroundsafe_get_lockset_task_name)BlockFunctionBlocksc                   @  s.   e Zd Zddd	Zed
d Zedd ZdS )Eventsession_hash
str | Nonefnr   requestfastapi.Requestusernamec                 C  sd   t  j| _|p
| j| _|| _|| _|| _|j| _d | _	d | _
d| _d| _d| _d| _t | _d S )NFTr   )uuiduuid4hex_idr   r    r!   r#   concurrency_iddataprogressprogress_pendingaliven_callsrun_timeasyncior   signal)selfr   r    r!   r#    r2   t/var/www/static.ux5.de/https/Moving-Object-Detection-with-OpenCV/env/lib/python3.10/site-packages/gradio/queueing.py__init__.   s   zEvent.__init__c                 C  s   | j jdkS )Nstream)r    
connectionr1   r2   r2   r3   	streamingC   s   zEvent.streamingc                 C  s,   | j std| jjd u rdS | j| jjkS )Nz6Cannot access if_finished during a non-streaming eventF)r8   
ValueErrorr    
time_limitr.   r7   r2   r2   r3   is_finishedG   s
   zEvent.is_finishedN)r   r   r    r   r!   r"   r#   r   )__name__
__module____qualname__r4   propertyr8   r;   r2   r2   r2   r3   r   -   s    

r   c                   @  s   e Zd ZdddZdS )	
EventQueuer(   strconcurrency_limit
int | Nonec                 C  s&   g | _ || _|| _d| _tt| _d S Nr   )queuer(   rB   current_concurrencyr   setstart_times_per_fn)r1   r(   rB   r2   r2   r3   r4   Q   s   
zEventQueue.__init__N)r(   rA   rB   rC   )r<   r=   r>   r4   r2   r2   r2   r3   r@   P   s    r@   c                   @  s   e Zd Zdd ZdddZdS )	ProcessTimec                 C  s   d| _ d| _d| _d S rD   process_timecountavg_timer7   r2   r2   r3   r4   \   s   
zProcessTime.__init__timefloatc                 C  s.   |  j |7  _ |  jd7  _| j | j | _d S )N   rJ   )r1   rN   r2   r2   r3   adda   s   zProcessTime.addN)rN   rO   )r<   r=   r>   r4   rQ   r2   r2   r2   r3   rI   [   s    rI   c                   @  s.  e Zd Z	dpdqddZdd ZdrddZdd ZdsddZdtdd Zd!d" Z	dud*d+Z
d,d- Zdvd0d1Zdwd2d3Zdxd5d6Zdyd8d9Zdyd:d;Zdzd@dAZ	B	Cd{d|dKdLZdMdMdNd}dPdQZdydRdSZ	Md~ddVdWZddYdZZedd[d\Zedd^d_ZeddadbZeddhdiZddldmZddndoZdMS )r   not_setlive_updatesboolconcurrency_countintupdate_intervalsrO   max_sizerC   blocksr   default_concurrency_limitint | None | Literal['not_set']c                 C  s   t d| _i | _i | _t | _i | _d| _|| _|| _	g | _
t | _d | _tt| _|| _d| _d| _|| _|| _g | _| || _i | _d S )Ni  Fg?g?)r   pending_messages_per_sessionpending_event_ids_sessionevent_ids_to_eventsr   pending_message_lockevent_queue_per_concurrency_idstoppedmax_thread_countrW   active_jobsdelete_lock
server_appr   rI   process_time_per_fnrS   sleep_when_freeprogress_update_sleep_when_freerX   rY   _asyncio_tasks_resolve_concurrency_limitrZ   event_analytics)r1   rS   rU   rW   rX   rY   rZ   r2   r2   r3   r4   h   s2   

zQueue.__init__c                 C  s:   d g| j  | _t| j t| j | jst| j d S d S N)rb   rc   r   start_processingstart_progress_updatesrS   notify_clientsr7   r2   r2   r3   start   s   

zQueue.startblock_fnr   c                 C  st   |j }|jdkr| j}n|j}|| jvrt||| j|< d S |d ur6| j| }|jd u s1||jk r8||_d S d S d S )Ndefault)r(   rB   rZ   r`   r@   )r1   rq   r(   rB   existing_event_queuer2   r2   r3   create_event_queue_for_fn   s   





zQueue.create_event_queue_for_fnc                 C  s
   d| _ d S )NT)ra   r7   r2   r2   r3   close      
zQueue.closeeventr   event_messager   c                 C  s,   |j sd S |j|_| j|j }|| d S rl   )r,   r'   event_idr\   r   
put_nowait)r1   rw   rx   messagesr2   r2   r3   send_message   s
   zQueue.send_messagereturnc                 C  s8   |dkr|S t jd }r| dkrdS t|S dS )a  
        Handles the logic of resolving the default_concurrency_limit as this can be specified via a combination
        of the `default_concurrency_limit` parameter of the `Blocks.queue()` or the `GRADIO_DEFAULT_CONCURRENCY_LIMIT`
        environment variable. The parameter in `Blocks.queue()` takes precedence over the environment variable.
        Parameters:
            default_concurrency_limit: The default concurrency limit, as specified by a user in `Blocks.queu()`.
        rR    GRADIO_DEFAULT_CONCURRENCY_LIMITnoneNrP   )osenvirongetlowerrV   )r1   rZ   default_concurrency_limit_envr2   r2   r3   rj      s   
z Queue._resolve_concurrency_limitc                 C  s&   d}| j  D ]	}|t|j7 }q|S rD   )r`   valueslenrE   )r1   	total_lenevent_queuer2   r2   r3   __len__   s   zQueue.__len__bodyr
   r!   r"   r#   r   tuple[bool, str]c           	   
     s  |j d u rdS | jd ur"t| | jkr"dd| j dt|  dfS |jr4| jj|j }|jj|j  }n| jj|j  }t	| jd |}| 
| t|j|||}||_|jd u r\|j|_| j4 I d H % |j| jvrqt | j|j< |j| jvr~t | j|j< W d   I d H  n1 I d H sw   Y  | j|j |j || j|j< z| j|j }W n ty } ztd|d }~ww |j| t dd |j|jd| j|j< | |jt|jd	  d
|jfS )N)FzNo function index provided.FzQueue is full. Max size is z and size is .zEvent not found in queue. If you are deploying this Gradio app with multiple replicas, please enable stickiness to ensure that all requests from the same user are routed to the same instance.queued)rN   statusrK   functionr   rP   T)fn_indexrX   r   r   rY   state_holderblocks_configfnsr   get_fnrt   r   r)   r_   r\   ThreadQueuer]   rG   rQ   r'   r^   r`   r(   KeyErrorrE   appendrN   api_namerk   broadcast_estimations)	r1   r   r!   r#   session_stater    rw   r   er2   r2   r3   push   sb   


(
z
Queue.pushc                 C  s   | j D ]}|  qg | _ d S rl   )ri   cancel)r1   taskr2   r2   r3   _cancel_asyncio_tasks  s   


zQueue._cancel_asyncio_tasksapp
routes.Appc                 C  s
   || _ d S rl   )re   )r1   r   r2   r2   r3   set_server_app  rv   zQueue.set_server_appc                 C  s$   d}| j D ]
}|d ur|d7 }q|S )Nr   rP   )rc   )r1   rL   workerr2   r2   r3   get_active_worker_count  s   
zQueue.get_active_worker_count$tuple[list[Event], bool, str] | Nonec                   s   t | j }t| |D ]P}| j| }t|jr^|jd u s%|j|jk r^|jd   j	} g}|j
}|rL| fdd|jdd  D d |jd  7 }|D ]}|j| qN|||f  S qd S )Nr   c                   s   g | ]
}|j  j kr|qS r2   )r    .0rw   first_eventr2   r3   
<listcomp>%  s
    z$Queue.get_events.<locals>.<listcomp>rP   )listr`   keysrandomshuffler   rE   rB   rF   r    batchmax_batch_sizeremove)r1   concurrency_idsr(   r   rq   eventsr   rw   r2   r   r3   
get_events  s,   




zQueue.get_eventsNonec           	   	     s  z| j st| dkrt| jI d H  qd | jvr$t| jI d H  q| j4 I d H  |  }W d   I d H  n1 I d H s@w   Y  |r|\}}}|| j| jd < | j	| }| j
d7  _
t }|j|d j | |D ]
}d| j|j d< qrt| j|||}t||d j|d jj|d j| | j| | jr| | n	t| jI d H  | j rW d| _ |   d S W d| _ |   d S d| _ |   w )Nr   rP   
processingr   T)ra   r   r/   sleeprg   rc   rd   r   indexr`   rF   rN   rH   r    rQ   rk   r'   r   process_eventsr   r   ri   r   rS   r   r   )	r1   event_batchr   r   r(   r   
start_timerw   process_event_taskr2   r2   r3   rm   0  sX   

(




''
zQueue.start_processingc                   s   | j s?dd | jD }t|dkrt| jI dH  q|D ]}|jr0|jr0d|_| ||j qt| jI dH  | j rdS dS )ah  
        Because progress updates can be very frequent, we do not necessarily want to send a message per update.
        Rather, we check for progress updates at regular intervals, and send a message if there is a pending update.
        Consecutive progress updates between sends will overwrite each other so only the most recent update will be sent.
        c                 S  "   g | ]}|d ur|D ]}|q
qS rl   r2   r   jobevtr2   r2   r3   r   c     " z0Queue.start_progress_updates.<locals>.<listcomp>r   NF)	ra   rc   r   r/   r   rh   r+   r*   r|   )r1   r   rw   r2   r2   r3   rn   \  s   zQueue.start_progress_updatesry   rA   	iterableslist[TrackedIterable] | Nonec              
   C  s   |d u rd S | j D ]4}|d u rq	|D ]*}|j|kr<g }|D ]}t|j|j|j|j|jd}|| qt	|d|_d|_
qq	d S )N)r   lengthunitr*   desc)progress_dataT)rc   r'   r   r   r   r   r*   r   r   r   r+   )r1   ry   r   r   r   r   iterableprogress_unitr2   r2   r3   set_progressp  s,   

zQueue.set_progress
   TlogtitlelevelLiteral['info', 'warning']durationfloat | Nonevisiblec           
      C  sF   dd | j D }|D ]}|j|kr t|||||d}	| ||	 q
d S )Nc                 S  r   rl   r2   r   r2   r2   r3   r     r   z%Queue.log_message.<locals>.<listcomp>)r   r   r   r   r   )rc   r'   r   r|   )
r1   ry   r   r   r   r   r   r   rw   log_messager2   r2   r3   r     s   	
zQueue.log_messageN)r   ry   r   c             	     s   | j D ]}|r|D ]}|j|ks|j|krd|_q
q| j4 I d H : g }| j D ]}|jD ]}|j|ks;|j|kr@|| q/q*|D ]}| j|j	 j
| qDW d   I d H  d S 1 I d H sbw   Y  d S )NF)rc   r   r'   r,   rd   r`   r   rE   r   r(   r   )r1   r   ry   job_setr   events_to_remover   rw   r2   r2   r3   clean_events  s*   


.zQueue.clean_eventsc                   sJ   | j s#t| jI dH  t| dkr| jD ]}| | q| j rdS dS )zQ
        Notify clients about events statuses in the queue periodically.
        Nr   )ra   r/   r   rW   r   r`   r   )r1   r(   r2   r2   r3   ro     s   
zQueue.notify_clientsr(   afterc              	     s  d}| j | }d}|j|jkrWg }|j D ])\}}|| jvr#d } n|jdkr.|jp,d n| j| j | fdd|D 7 }q|d urWt	|dkrWt
|}	t|	t  d}t|jD ]c\}
}|j| jv rm| j|j jnd }|d ur|d ur|d ur|| | nd }|d u s|
|kr| |t|
|t	|jd |jd u rd}q\|d ur|d ur||j }|jr|pd|j }||7 }q\d }q\d S )Nr   r5   c                   s   g | ]}|  qS r2   r2   )r   r   rK   r2   r3   r     s    z/Queue.broadcast_estimations.<locals>.<listcomp>)rankrank_eta
queue_size)r`   rF   rB   rH   itemsrf   r6   r:   rM   r   minmaxrN   	enumeraterE   r    r|   r   r8   )r1   r(   r   wait_so_farr   time_till_available_workerexpected_end_timesr    start_timestime_of_first_completionr   rw   process_time_for_fnr   deltar2   r   r3   r     sb   






zQueue.broadcast_estimationsr   c                 C  s   t t| dS )N)r   )r   r   r7   r2   r2   r3   
get_status  s   zQueue.get_statusc                   s   | j  I d H  dS )Nr0   )r0   wait)rw   r2   r2   r3   wait_for_event     zQueue.wait_for_eventtimeoutc                   s   t | I d H  dS )Nr   )r/   r   )r   r2   r2   r3   r   	  r   zQueue.timeoutLiteral['signal', 'timeout']c                   sj   t t| }t t|}t j||gt jdI d H \}}dd |D }| j  t	t
d |d S )Nreturn_whenc                 S     g | ]}|  qS r2   resultr   dr2   r2   r3   r         z3Queue.wait_for_event_or_timeout.<locals>.<listcomp>)r0   r   r   )r/   create_taskr   r   r   r   FIRST_COMPLETEDr0   clearr   r   )rw   r   t1t2done_r2   r2   r3   wait_for_event_or_timeout  s   
zQueue.wait_for_event_or_timeoutr   list[Event]timeoutslist[float]tuple[list[Event], list[Event]]c           
   	     s   g }t | |ddD ]\}}|tt|| q
tj|tjdI d H \}}dd |D }g }g }t || ddD ]\}	}|	dkrH|| q:|| q:||fS )NF)strictr   c                 S  r   r2   r   r   r2   r2   r3   r   )  r   z(Queue.wait_for_batch.<locals>.<listcomp>r0   )zipr   r/   r   r   r   r   ALL_COMPLETED)
r   r   tasksrw   r   r   r   awake_eventsclosed_eventsr   r2   r2   r3   wait_for_batch  s$   zQueue.wait_for_batchr   
begin_timec                   s`  g }|d j }d}zĐzI|D ]}|jr.| |t|| jv r$| j| jnd d || q|sW W | j|d j }| j	d8  _	|j
| }	||	v rP|	| zd | j| j|< W n	 tyd   Y nw |D ]$}| |jI d H  ||v r|rzdnd| j|j d< qgd| j|j d< qgd S |}|d j}
|
d u rtd	|d j}|s|d jnd |
_z|d j|
_W n	 ty   Y nw |rttd
d |D ddi|
_|d j|
_d|
_| j}|d u rtdtj|
||d d}|
jd usJ tj|
jt d|jd}d}z6t ! }tj"||
|||dI d H }t ! }|| }d }|D ]}| j#|| 7  _#|j$r5|j% |d< q W n8 typ } z+t&'  d }|}|D ]}t(||) j*}| |t+||,dddd qKW Y d }~nd }~ww |r|,ddr|}|}|r|,ddrt ! }|}|}|D ]%}| |t-|j$st.j/nt.j0||d u|j$rt1t2|j3| nd d qdd |D }|s&W W | j|d j }| j	d8  _	|j
| }	||	v r|	| zd | j| j|< W n
 ty   Y nw |D ](}| |jI d H  ||v r|rdnd| j|j d< qd| j|j d< qd S z{t ! }|d j$rWt45|t1t6|j3| gt7| I d H \}}|D ]}| |t+|dd qI|s\W nkt1t8|d j}
|rvttdd |D ddi|
_tj"||
|||dI d H }t ! }|D ]}| j#|| 7  _#|j$r|j% |d< qW n ty } zt&'  d }|}W Y d }~nd }~ww |r|,dds|rd}|}nd}|p|}t(||) j*}|D ]}| |t+||d qn8|r't9:|}t;|D ]+\}}|rd|v rtt|,dddi| |d< |d u}| |t+||d qt   }|d urU|d j$s:|| n|}| j|d j  <| |D ]}|| j|j d< qIW n tym } z
t&'  W Y d }~nd }~ww W | j|d j }| j	d8  _	|j
| }	||	v r|	| zd | j| j|< W n
 ty   Y nw |D ](}| |jI d H  ||v r|rdnd| j|j d< qd| j|j d< qd S | j|d j }| j	d8  _	|j
| }	||	v r|	| zd | j| j|< W n
 ty   Y nw |D ](}| |jI d H  ||v r%|rdnd| j|j d< qd| j|j d< qw )Nr   F)etarP   successfailedr   	cancelledzNo event datac                 S     g | ]	}|j r|j j qS r2   r)   r   r2   r2   r3   r   V  s    z(Queue.process_events.<locals>.<listcomp>r  TServer app has not been set.)r   r    r#   r!   z/queue/join)r!   
route_path	root_path)r   r   
gr_requestr    r  is_generatingr   Error)outputr   r
  )msgr  r
  r:   c                 S  s   g | ]}|j r|qS r2   )r,   r   r2   r2   r3   r     s    )r  r
  c                 S  r  r2   r  r   r2   r2   r3   r     s    r)   rK   )=r    r,   r|   r   rf   rM   r   r`   r(   rF   rH   r   rc   r   r9   reset_iteratorsr'   rk   r)   r#   ry   r!   r   r  batchedre   	Exceptionr   compile_gr_requestget_root_urlr   r  rN   	monotoniccall_process_apir.   r8   r;   	traceback	print_excr   
get_blocks
show_errorr   r   r   r   process_generatingprocess_streamingr   rV   r:   r   r  rO   r   r
   copydeepcopyr   rQ   )r1   r   r   r  r  r    r
  rw   r   r   r   r#   r   r  r  first_iterationrp   responseenderrr   contentold_responseold_errr  closed_eventr  errorend_timer   r2   r2   r3   r   3  s(  


 6


 



W




C










zQueue.process_eventsc              	     sz   | j }|d u rtd||jvrd S |j4 I d H  |j|= |j| W d   I d H  d S 1 I d H s6w   Y  d S )Nr  )re   r  	iteratorslockiterators_to_resetrQ   )r1   ry   r   r2   r2   r3   r    s   
zQueue.reset_iterators)rR   )rS   rT   rU   rV   rW   rO   rX   rC   rY   r   rZ   r[   )rq   r   )rw   r   rx   r   )rZ   r[   r}   rC   )r   r
   r!   r"   r#   r   r}   r   )r   r   )r}   rV   )r}   r   )r}   r   )ry   rA   r   r   )r   T)ry   rA   r   rA   r   rA   r   r   r   r   r   rT   )r   r   ry   r   r}   r   rl   )r(   rA   r   rC   r}   r   )r}   r   )rw   r   r}   rA   )r   rO   r}   rA   )rw   r   r   rO   r}   r   )r   r   r   r   r}   r   )r   r   r   rT   r  rO   r}   r   )ry   rA   )r<   r=   r>   r4   rp   rt   ru   r|   rj   r   r   r   r   r   r   rm   rn   r   r   r   ro   r   r   staticmethodr   r   r   r  r   r  r2   r2   r2   r3   r   g   sJ    $



5




,


B
 dr   )2
__future__r   r/   r$  r   r   rN   r  r$   collectionsr   rE   r   r   typingr   r   r   fastapigradior   r	   gradio.data_classesr
   gradio.helpersr   gradio.route_utilsr   gradio.server_messagesr   r   r   r   r   r   r   r   r   gradio.utilsr   r   r   r   r   gradio.blocksr   r   r   r@   rI   r2   r2   r2   r3   <module>   s0    ,#