a
    e	gh                     @   s   d 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	m
Z
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	rddlZejZn.zddlZejZW n ey   dZeZY n0 dZG dd dejZG dd deZ dS )z%Async gunicorn worker for aiohttp.web    N)	FrameType)TYPE_CHECKINGAnyOptional)AccessLogFormat)base)web   )
set_result)Application)AccessLogger)GunicornWebWorkerGunicornUVLoopWebWorkerc                       s   e Zd ZejZejZe	e	dd fddZ
dd fddZdddd	Zddd
dZddddZd ed ddddZddddZeee ddddZeee ddddZee	ddddZeedddZ  ZS )!r   N)argskwreturnc                    s(   t  j|i | d | _d| _d | _d S Nr   )super__init___task	exit_code_notify_waiter)selfr   r   	__class__ Q/var/www/html/llm_bihealth/app/venv/lib/python3.9/site-packages/aiohttp/worker.pyr   *   s    zGunicornWebWorker.__init__r   c                    s0   t    t  | _t | j t   d S )N)asyncioget_event_loopcloseZnew_event_looploopZset_event_loopr   init_processr   r   r   r   r"   1   s    
zGunicornWebWorker.init_processc                 C   sp   | j |  | _z| j | j W n tyB   | jd Y n0 | j | j   | j 	  t
| j d S )NzException in gunicorn worker)r!   Zcreate_task_runr   Zrun_until_complete	Exceptionlog	exceptionZshutdown_asyncgensr    sysexitr   r#   r   r   r   run:   s    
zGunicornWebWorker.runc                    s  d }t | jtr| j}nHt| jrP|  I d H }t |tjrJ|}|j}q`|}ntd	| j|d u r| j
jrx| jjnd }tj|| j| j
j|| | j
j| j
jd d d}| I d H  | j
jr| | j
nd }|}|d usJ |j}|d usJ | jD ]"}tj|||d}| I d H  qt }	z| jr|   |j}
| jrj|
| jkrjd| _| jd|  nB|	t kr| j t! krd| _| jd|  n| " I d H  q*W n t#y   Y n0 |$ I d H  d S )	NzUwsgi app should be either Application or async function returning Application, got {}d   _   )loggerZkeepalive_timeout
access_logaccess_log_formatZshutdown_timeout)ssl_contextFzMax requests, shutting down: %sz!Parent changed, shutting down: %s)%
isinstancewsgir   r   iscoroutinefunctionr   Z	AppRunnerappRuntimeErrorformatcfgZ	accesslogr&   r.   	keepalive_get_valid_log_formatr/   Zgraceful_timeoutsetupZis_ssl_create_ssl_contextserverZsocketsZSockSitestartosgetpidalivenotifyZrequests_countZmax_requestsinfoZppidgetppid_wait_next_notifyBaseExceptioncleanup)r   runnerr4   r2   r.   ctxr<   socksitepidZcntr   r   r   r$   F   sl    

zGunicornWebWorker._runzasyncio.Future[bool]c                 C   s>   |    | j}|d usJ |  | _}| jd| j | |S )Ng      ?)_notify_waiter_doner!   Zcreate_futurer   Z
call_later)r   r!   waiterr   r   r   rD      s    z#GunicornWebWorker._wait_next_notify)rM   r   c                 C   s4   |d u r| j }|d ur t|d || j u r0d | _ d S )NT)r   r
   )r   rM   r   r   r   rL      s    

z%GunicornWebWorker._notify_waiter_donec                 C   s   | j tj| jtjd  | j tj| jtjd  | j tj| jtjd  | j tj| j	tjd  | j tj
| jtj
d  | j tj| jtjd  ttjd ttj
d d S NF)r!   Zadd_signal_handlersignalSIGQUIThandle_quitSIGTERMZhandle_exitSIGINTSIGWINCHZhandle_winchSIGUSR1Zhandle_usr1SIGABRThandle_abortsiginterruptr#   r   r   r   init_signals   s(    zGunicornWebWorker.init_signals)sigframer   c                 C   s   d| _ | j|  |   d S rN   )r@   r7   Z
worker_intrL   r   rZ   r[   r   r   r   rQ      s    zGunicornWebWorker.handle_quitc                 C   s&   d| _ d| _| j|  td d S )NFr	   )r@   r   r7   Zworker_abortr(   r)   r\   r   r   r   rW      s    zGunicornWebWorker.handle_abort
SSLContext)r7   r   c                 C   s\   t du rtdt | j}|| j| j | j|_| j	rF|
| j	 | jrX|| j |S )z~Creates SSLContext instance for usage in asyncio.create_server.

        See ssl.SSLSocket.__init__ for more details.
        NzSSL is not supported.)sslr5   r]   ssl_versionload_cert_chaincertfilekeyfile	cert_reqsverify_modeca_certsload_verify_locationsciphersset_ciphers)r7   rH   r   r   r   r;      s    z%GunicornWebWorker._create_ssl_context)source_formatr   c                 C   s.   || j kr| jS td|r&tdn|S d S )Nz%\([^\)]+\)zGunicorn's style options in form of `%(name)s` are not supported for the log formatting. Please use aiohttp's format specification to configure access log formatting: http://docs.aiohttp.org/en/stable/logging.html#format-specification)DEFAULT_GUNICORN_LOG_FORMATDEFAULT_AIOHTTP_LOG_FORMATresearch
ValueError)r   ri   r   r   r   r9      s    
z'GunicornWebWorker._get_valid_log_format)N)__name__
__module____qualname__r   Z
LOG_FORMATrk   GunicornAccessLogFormatdefaultrj   r   r   r"   r*   r$   rD   r   rL   rY   intr   rQ   rW   staticmethodr;   strr9   __classcell__r   r   r   r   r   %   s$   	B "	r   c                       s"   e Zd Zdd fddZ  ZS )r   Nr   c                    s0   dd l }t   t|  t   d S r   )uvloopr   r   r    Zset_event_loop_policyZEventLoopPolicyr   r"   )r   rx   r   r   r   r"      s    z$GunicornUVLoopWebWorker.init_process)ro   rp   rq   r"   rw   r   r   r   r   r      s   r   )!__doc__r   r>   rl   rO   r(   typesr   typingr   r   r   Zgunicorn.configr   rr   Zgunicorn.workersr   Zaiohttpr   Zhelpersr
   Zweb_appr   Zweb_logr   r^   r]   ImportErrorobject__all__ZWorkerr   r   r   r   r   r   <module>   s4   

 K