o
    e,                     @   s,  d dl mZmZm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 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gZeedZeedZeddZ G dd de!Z"G dd de#Z$eeG dd de#Z%dS )    )print_functionabsolute_importdivisionN)ref)
getcurrent)config)get_original)notify)EventLoopBlocked)MemoryUsageThresholdExceeded)MemoryUsageUnderThreshold)IPeriodicMonitorThread)implementer)GreenletTracer)thread_mod_name)perf_counter)get_this_psutil_processPeriodicMonitoringThread	get_identstart_new_threadtimesleepc                   @   s   e Zd ZdZdS )MonitorWarningzThe type of warnings we emit.N)__name__
__module____qualname____doc__ r   r   ?D:\Projects\ConvertPro\env\Lib\site-packages\gevent/_monitor.pyr   %   s    r   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )_MonitorEntryfunctionperiodlast_run_timec                 C   s   || _ || _d| _d S Nr   r    selfr!   r"   r   r   r   __init__-   s   
z_MonitorEntry.__init__c                 C   s   | j |j ko| j|jkS N)r!   r"   )r&   otherr   r   r   __eq__2   s   z_MonitorEntry.__eq__c                 C   s   t | j| jfS r(   )hashr!   r"   r&   r   r   r   __hash__5   s   z_MonitorEntry.__hash__c                 C   s   t | j| j| jfS r(   )reprr!   r"   r#   r,   r   r   r   __repr__8   s   z_MonitorEntry.__repr__N)r   r   r   	__slots__r'   r*   r-   r/   r   r   r   r   r   )   s    r   c                   @   s   e Zd ZdZdZdZdZdZdZdZ	dd Z
dd	 Zed
d Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' ZdS )(r   g       @g{Gzt?   Nr   c                 C   s`   t || j| _d| _t |jksJ t | _t| j	t
jg| _t
j| _t| d| _t | _d S )NTr   )wref
_on_hub_gc	_hub_wref
should_runget_thread_identZthread_identr   _greenlet_tracerr   monitor_blockingGEVENT_CONFIGmax_blocking_time_monitoring_functions_calculated_sleep_timer   monitor_thread_identosgetpidpid)r&   hubr   r   r   r'   \   s   z!PeriodicMonitoringThread.__init__c                 C   s,   t  }|| jkr|| _t| d| _d S d S )Nr   )r>   r?   r@   r   r=   )r&   r@   r   r   r   _on_forko   s
   
z!PeriodicMonitoringThread._on_forkc                 C   s   |   S r(   )r4   r,   r   r   r   rA   w   s   zPeriodicMonitoringThread.hubc                 C   s>   t j}|| jd jkr|| jd _tdd | jD | _| jS )Nr   c                 s       | ]}|j V  qd S r(   r"   .0xr   r   r   	<genexpr>       z@PeriodicMonitoringThread.monitoring_functions.<locals>.<genexpr>)r9   r:   r;   r"   minr<   )r&   Zmbtr   r   r   monitoring_functions|   s
   z-PeriodicMonitoringThread.monitoring_functionsc                    s   t std|d u rfdd| jD | _n$|dkr tdt|  fdd| jD | _ | jvr<| j  tdd | jD | _d S )	Nzfunction must be callablec                    s   g | ]	}|j  kr|qS r   r!   rE   rL   r   r   
<listcomp>   s
    
zDPeriodicMonitoringThread.add_monitoring_function.<locals>.<listcomp>r   zPeriod must be positive.c                    s   g | ]}|j kr|n qS r   rL   rE   entryr!   r   r   rM      s    c                 s   rC   r(   rD   rE   r   r   r   rH      rI   zCPeriodicMonitoringThread.add_monitoring_function.<locals>.<genexpr>)callable
ValueErrorr;   r   appendrJ   r<   r%   r   rN   r   add_monitoring_function   s   



z0PeriodicMonitoringThread.add_monitoring_functionc                 C   s"   | j }|dkr
| jS t|| jfS r$   )r<   inactive_sleep_timemaxmin_sleep_time)r&   Z	min_sleepr   r   r   calculate_sleep_time   s   z-PeriodicMonitoringThread.calculate_sleep_timec                 C   s   | j sd S d| _ | j  d S )NF)r5   r7   killr,   r   r   r   rX      s   zPeriodicMonitoringThread.killc                 C   s   |    d S r(   )rX   )r&   _r   r   r   r3         z#PeriodicMonitoringThread._on_hub_gcc           	      C   s   t | t _zI| jrM|  }|sJ |  }t| | j}|s#|   | jrFt	 }|D ]}|j
}|j}|j}|rE|| |krE||_|| q+~| js
W d S W d S  tyY   Y d S    tratjsdY d S | j}|d ury|j| gt R   Y d S Y d S r(   )r2   r   Zgevent_monitoring_threadr5   rK   rW   thread_sleeprA   rX   r   r!   r"   r#   
SystemExitsysstderrhandle_errorexc_info)	r&   Z	functionsZ
sleep_timerA   Zthis_runrO   fr"   Zlast_runr   r   r   __call__   s>   
z!PeriodicMonitoringThread.__call__c                 C   sl   | j |}|s
d S |d }| j ||td| jd}|j}|D ]}t||d q tt|t	j
| ||fS )N   F)Zgreenlet_stacksZcurrent_thread_ident)file)r7   Zdid_block_hubZdid_block_hub_reportdictr=   Zexception_streamprintr	   r
   r9   r:   )r&   rA   Z	did_blockZactive_greenletreportstreamliner   r   r   r8      s   z)PeriodicMonitoringThread.monitor_blockingc                 C      | j   d S r(   )r7    ignore_current_greenlet_blockingr,   r   r   r   rk         z9PeriodicMonitoringThread.ignore_current_greenlet_blockingc                 C   rj   r(   )r7   !monitor_current_greenlet_blockingr,   r   r   r   rm      rl   z:PeriodicMonitoringThread.monitor_current_greenlet_blockingc                    s   t    fdd| _ S )Nc                      s    S r(   r   r   procr   r   <lambda>  s    z7PeriodicMonitoringThread._get_process.<locals>.<lambda>)r   _get_processr,   r   rn   r   rq     s   z%PeriodicMonitoringThread._get_processc                 C   s   |   d uS r(   )rq   r,   r   r   r   can_monitor_memory_usage  rZ   z1PeriodicMonitoringThread.can_monitor_memory_usagec                 C   s<   |   sdd l}|dt d S | | jttj| j	 d S )Nr   z/Unable to monitor memory usage. Install psutil.)
rr   warningswarnr   rS   monitor_memory_usagerU   r9   Zmemory_monitor_periodmin_memory_monitor_period)r&   rs   r   r   r   install_monitor_memory_usage	  s   z5PeriodicMonitoringThread.install_monitor_memory_usagec                 C   s   t j}|sdS |   }t|ddp|j}d }||kr0|| jkr+t|||}t| || _|S | jr?t	|||| j}t| d| _|S )NZussr   )
r9   Zmax_memory_usagerq   Zmemory_full_infogetattrZrss_memory_exceededr   r	   r   )r&   Z_hubZmax_allowedZrusageZ	mem_usageeventr   r   r   ru     s*   
	
z-PeriodicMonitoringThread.monitor_memory_usagec                 C   s*   d| j jtt| t| jt |  f S )Nz*<%s at %s in thread %s greenlet %r for %r>)	__class__r   hexidr=   r   r4   r,   r   r   r   r/   4  s   
z!PeriodicMonitoringThread.__repr__)r   r   r   rT   rV   rv   r;   r<   rz   r7   r'   rB   propertyrA   rK   rS   rW   rX   r3   rb   r8   rk   rm   rq   rr   rw   ru   r/   r   r   r   r   r   <   s4    

		.)&
__future__r   r   r   r>   r]   weakrefr   r2   Zgreenletr   Zgeventr   r9   Zgevent.monkeyr   Zgevent.eventsr	   r
   r   r   r   r   Zgevent._tracerr   Zgevent._compatr   r   r   __all__r6   r   r[   RuntimeWarningr   objectr   r   r   r   r   r   <module>   s4   


