U
    d                     @   s   d Z ddlZddlmZ ddlmZmZ ddlmZm	Z	 ddlm
Z ddlmZm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 ddlmZ dZdddddhZerdehZndhZeeZ e j!e j" Z!Z"dd Z#dd Z$G dd deZ%dS )zKPrefork execution pool.

Pool implementation using :mod:`multiprocessing`.
    N)forking_enable)REMAP_SIGTERMTERM_SIGNAME)CLOSERUN)Pool)	platformssignals)_set_task_join_will_blockset_default_app)trace)BasePool)noop)
get_logger   )AsynPool)TaskPoolprocess_initializerprocess_destructorSIGTERMSIGHUPSIGTTINSIGTTOUSIGUSR1SIGINTc                 C   sN  t d td t jjt  t jjt  t jd|d | j	
  | j	  tjdpZd}|rtd| krtd| j_| jjttjd	d
pd
|ttjddttjd|d tjdrt| | n |   t|  |   | jt_d
dlm} | j D ] \}}|||| j	|| d|_ qd
dl!m"} |#  tj$j%dd dS )zPool child process initializer.

    Initialize the child pool process to ensure the correct
    app instance is used and things like logging works.
    SIGKILLTZceleryd)hostnameZCELERY_LOG_FILENz%iFZCELERY_LOG_LEVELr   ZCELERY_LOG_REDIRECTZCELERY_LOG_REDIRECT_LEVELZFORKED_BY_MULTIPROCESSING)build_tracer)app)state)sender)&r   Zset_pdeathsigr
   r	   resetWORKER_SIGRESETignoreWORKER_SIGIGNOREZset_mp_process_titleloaderZinit_workerZinit_worker_processosenvirongetlowerlogZalready_setupsetupintboolstrr   Zsetup_worker_optimizationsZset_currentr   finalizeZ_tasksZcelery.app.tracer   ZtasksitemsZ	__trace__Zcelery.workerr   Zreset_stateZworker_process_initsend)r   r   logfiler   nameZtaskZworker_state r4   >/tmp/pip-unpacked-wheel-mu1yl971/celery/concurrency/prefork.pyr   &   s<    


r   c                 C   s   t jjd| |d dS )z_Pool child process destructor.

    Dispatch the :signal:`worker_process_shutdown` signal.
    N)r    pidexitcode)r	   Zworker_process_shutdownr1   )r6   r7   r4   r4   r5   r   R   s
      r   c                   @   sl   e Zd ZdZeZeZdZ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edd ZdS )r   z$Multiprocessing Pool implementation.TNc              	   C   s   t | j  | jddr| jn| j}| jr4| jjjnd }|f | jt	t
dd|d| j }| _|j| _|j| _|j| _|j| _|j| _t|dd | _d S )NthreadsTF)	processesZinitializerZon_process_exitZenable_timeoutsZsynackproc_alive_timeoutflush)r   optionsr(   BlockingPoolr   r   confZworker_proc_alive_timeoutlimitr   r   _poolapply_asyncZon_applyZmaintain_poolZterminate_jobZgrowshrinkgetattrr;   )selfr   r:   Pr4   r4   r5   on_starte   s,    
	zTaskPool.on_startc                 C   s   | j   | j t d S N)r@   restartrA   r   rD   r4   r4   r5   rH   }   s    
zTaskPool.restartc                 C   s
   | j  S rG   )r@   did_start_okrI   r4   r4   r5   rJ      s    zTaskPool.did_start_okc                 C   s,   z| j j}W n tk
r"   Y d S X ||S rG   )r@   register_with_event_loopAttributeError)rD   Zloopregr4   r4   r5   rK      s
    z!TaskPool.register_with_event_loopc                 C   s8   | j dk	r4| j jttfkr4| j   | j   d| _ dS )zGracefully stop the pool.N)r@   _stater   r   closejoinrI   r4   r4   r5   on_stop   s    

zTaskPool.on_stopc                 C   s   | j dk	r| j   d| _ dS )zForce terminate the pool.N)r@   	terminaterI   r4   r4   r5   on_terminate   s    

zTaskPool.on_terminatec                 C   s$   | j d k	r | j jtkr | j   d S rG   )r@   rN   r   rO   rI   r4   r4   r5   on_close   s    zTaskPool.on_closec                 C   s\   t | jdd }| jdd | jjD | jjp,d| j| jjp:d| jjpDdf|d k	rT| nddS )NZhuman_write_statsc                 S   s   g | ]
}|j qS r4   )r6   ).0pr4   r4   r5   
<listcomp>   s     z&TaskPool._get_info.<locals>.<listcomp>zN/Ar   )zmax-concurrencyr9   zmax-tasks-per-childzput-guarded-by-semaphoreZtimeoutsZwrites)rC   r@   r?   Z_maxtasksperchildZputlocksZsoft_timeouttimeout)rD   write_statsr4   r4   r5   	_get_info   s    


zTaskPool._get_infoc                 C   s   | j jS rG   )r@   Z
_processesrI   r4   r4   r5   num_processes   s    zTaskPool.num_processes)__name__
__module____qualname____doc__r   r   r=   Zuses_semaphorerY   rF   rH   rJ   rK   rQ   rS   rT   rZ   propertyr[   r4   r4   r4   r5   r   \   s   r   )&r_   r&   Zbilliardr   Zbilliard.commonr   r   Zbilliard.poolr   r   r   r=   Zceleryr   r	   Zcelery._stater
   r   Z
celery.appr   Zcelery.concurrency.baser   Zcelery.utils.functionalr   Zcelery.utils.logr   Zasynpoolr   __all__r"   r$   r\   loggerwarningdebugr   r   r   r4   r4   r4   r5   <module>   s6       
,
