HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux spn-python 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64
User: arjun (1000)
PHP: 8.1.2-1ubuntu2.20
Disabled: NONE
Upload Files
File: //home/arjun/projects/env/lib/python3.10/site-packages/honcho/__pycache__/manager.cpython-310.pyc
o

weu�@s�ddlZddlZddlZddlZddlZddlmZddlmZddl	m
Z
ddlmZm
Z
dZejdd	d
�ejddd
�iZd
ZGdd�de�ZdS)�N�)�get_colours)�Env)�Process)�Printer�Message��SIGINT�)�name�rc�SIGTERM��systemc@sreZdZdZdZddd�Zddd�Zdd	�Zd
d�Zdd
�Z	ddd�Z
dd�Zdd�Zdd�Z
dd�Zdd�ZdS)�Managera�
    Manager is responsible for running multiple external processes in parallel
    managing the events that result (starting, stopping, printing). By default
    it relays printed lines to a printer that prints to STDOUT.

    Example::

        import sys
        from honcho.manager import Manager

        m = Manager()
        m.add_process('server', 'ruby server.rb')
        m.add_process('worker', 'python worker.py')
        m.loop()

        sys.exit(m.returncode)
    NcCsZt��|_d|_t�|_t�|_|dur|ntt	j
�|_tt
�|j_t|_i|_d|_dS)NF)�multiprocessing�Queue�events�
returncoder�_coloursr�_envr�sys�stdout�_printer�len�SYSTEM_PRINTER_NAME�widthr�
_process_ctor�
_processes�_terminating)�self�printer�r"�G/home/arjun/projects/env/lib/python3.10/site-packages/honcho/manager.py�__init__1s

zManager.__init__FcCs`||jvs	Jd��|j|||t|j�||d�}i|j|<||j|d<t|jjt|��|j_|S)z�
        Add a process to this manager instance. The process will not be started
        until :func:`~honcho.manager.Manager.loop` is called.
        zprocess names must be unique)r�quiet�colour�env�cwd�obj)rr�nextr�maxrrr)r r�cmdr%r'r(�procr"r"r#�add_process@s�
zManager.add_processcs~�fdd�}t�tj|�t�tj|����d}d}	z	�jjdd�}Wntjy5|r3YdSYnSw|jdkrB�j	�
|�nF|jd	kr`|jd
�j|j
d
<��d|j
|jd
f�n(|jdkr�|jd
�j|j
d
<��d|j
|jd
f��jdur�|jd
�_���r����r�d}|dur����r����r��j��}���|dur��j��|}|tjtd�kr����q)aj
        Start all the added processes and multiplex their output onto the bound
        printer (which by default will print to STDOUT).

        If one process terminates, all the others will be terminated by
        Honcho, and :func:`~honcho.manager.Manager.loop` will return.

        This method will block until all the processes have terminated.
        cs0��dt|d�t|d�_���dS)Nz%s received
rr)�
_system_print�SIGNALSr�	terminate)�signum�frame�r r"r#�
_terminate^sz Manager.loop.<locals>._terminateFNrg�������?)�timeout�line�start�pidz%s started (pid=%s)
�stoprz%s stopped (rc=%s)
T)�seconds)�signalr
r	�_startr�get�queue�Empty�typer�write�datarrr/r�_all_started�_all_stopped�_any_stoppedr�nowr1�datetime�	timedelta�	KILL_WAIT�kill)r r5�exit�
exit_start�msg�waitingr"r4r#�loopTsL
��

�
�

�zManager.loopcCs|jrdSd|_|��dS)zI
        Terminate all processes managed by this ProcessManager.
        NT)r�_killallr4r"r"r#r1�szManager.terminatecCs|jdd�dS)zD
        Kill all processes managed by this ProcessManager.
        T)�forceN)rQr4r"r"r#rK�szManager.killcCs�g}|j��D]
\}}d|vr|�|�q|D],}|j|}|r"dnd}|�d|||df�|r;|j�|d�q|j�|d�qdS)z6Kill all remaining processes, forcefully if requested.r�SIGKILLr
zsending %s to %s (pid %s)
r9N)r�items�appendr/rrKr1)r rR�for_termination�n�p�signamer"r"r#rQ�s
�
��zManager._killallcCsD|j��D]\}}tj||dj|jdfd�|d<|d��qdS)Nr)T)r�target�args�process)rrTrr�runrr8)r rrXr"r"r#r=�s
��zManager._startcC�tdd�|j��D��S)Ncs�"�|]\}}|�d�duVqdS)r9N�r>��.0�_rXr"r"r#�	<genexpr>��� z'Manager._all_started.<locals>.<genexpr>��allrrTr4r"r"r#rD��zManager._all_startedcCr^)Ncsr_�rNr`rar"r"r#rd�rez'Manager._all_stopped.<locals>.<genexpr>rfr4r"r"r#rE�rhzManager._all_stoppedcCr^)Ncsr_rir`rar"r"r#rd�rez'Manager._any_stopped.<locals>.<genexpr>)�anyrrTr4r"r"r#rF�rhzManager._any_stoppedc	Cs$|j�td||j��tdd��dS)Nr7)rArC�timerr&)rrBrrrGr)r rCr"r"r#r/�s
�zManager._system_print)N)FNN)F)�__name__�
__module__�__qualname__�__doc__rr$r.rPr1rKrQr=rDrErFr/r"r"r"r#rs

9	
r)rHr?rr<rr&r�environrr\rr!rrrJr	r
r0r�objectrr"r"r"r#�<module>s*���