
    G@d-                         d Z ddlmZ ddlZddlZddlmZmZmZm	Z	m
Z
mZ ddlmZ ej        dk    Zd Z G d d	e          Z G d
 de          Z G d de          Zd ZddZd Zedk    r e             dS dS )zZ
Worker manager and workers for running files long processes in non GUI
blocking threads.
    )dequeN)
QByteArrayQObjectQProcessQThreadQTimerSignal)to_text_stringntc                 v    t          | t                    r|                                 } t          | |          S )z"Qt/Python2/3 compatibility helper.)encoding)
isinstancer   datar
   )objr   s     4lib/python3.11/site-packages/spyder/utils/workers.pyhandle_qbytearrayr      s4    #z"" hhjj#1111    c                   j     e Zd ZdZ ee          Z eeee          Z fdZd Z	d Z
d Zd Z xZS )PythonWorkerz
    Generic python worker for running python code on threads.

    For running processes (via QProcess) use the ProcessWorker.
    c                     t          t          |                                            || _        || _        || _        d| _        d| _        dS )z9Generic python worker for running python code on threads.FN)superr   __init__funcargskwargs_is_finished_started)selfr   r   r   	__class__s       r   r   zPythonWorker.__init__.   sG    lD!!**,,,		!r   c                     | j         S )z@Return True if worker status is finished otherwise return False.r   r   s    r   is_finishedzPythonWorker.is_finished7   s      r   c                 Z    | j         s#| j                            |            d| _         dS dS )z?Start the worker (emits sig_started signal with worker as arg).TNr   sig_startedemitr"   s    r   startzPythonWorker.start;   8    } 	!!!$''' DMMM	! 	!r   c                     d| _         dS )zMark the worker as finished.TNr!   r"   s    r   	terminatezPythonWorker.terminateA   s     r   c                     d}d}	  | j         | j        i | j        }n# t          $ r}|}Y d}~nd}~ww xY w| j        s.	 | j                            | ||           n# t          $ r Y nw xY wd| _        dS )z6Start process worker for given method args and kwargs.NT)r   r   r   	Exceptionr   sig_finishedr'   RuntimeError)r   erroroutputerrs       r   _startzPythonWorker._startE   s    	TY	9T[99FF 	 	 	EEEEEE	   	!&&tVU;;;;    s!    
4/4A 
A)(A))__name__
__module____qualname____doc__r	   objectr&   r.   r   r#   r(   r+   r3   __classcell__r   s   @r   r   r   %   s         
 &..K6&&&11L    ! ! !! ! !! ! !! ! ! ! ! ! !r   r   c                        e Zd ZdZ ee          Z eeee          Z eeee          Zd fd	Z	d Z
d Zd Zd Zd Zd	 Zd
 Zd Zd Zd Z xZS )ProcessWorkerz7Process worker based on a QProcess for non blocking UI.Nc                    t          t          |                               |           d| _        || _        d| _        d| _        d| _        d| _        t          |           | _
        t          |           | _        |                     |           | j
                            d           | j
        j                            | j                   | j        j                            | j                   dS )z
        Process worker based on a QProcess for non blocking UI.

        Parameters
        ----------
        cmd_list : list of str
            Command line arguments to execute.
        environ : dict
            Process environment,
        NF   )r   r<   r   _result	_cmd_list_fired_communicate_first_partial_stdoutr   r   _timerr   _process_set_environmentsetIntervaltimeoutconnect_communicatereadyReadStandardOutput_partial)r   parentcmd_listenvironr   s       r   r   zProcessWorker.__init__^   s     	mT""++F333!"'#Tll g&&&$$$##D$5666-55dmDDDDDr   c                     d}t           r4ddl}t          |j        j                                                  }d|z   }|S )z$Return the encoding/codepage to use.zutf-8r   Ncp)WINctypesr
   cdllkernel32GetACP)r   encorS   codepages       r   _get_encodingzProcessWorker._get_encodingy   sH      	#MMM%fk&:&A&A&C&CDDH (?Dr   c                     |re| j                                         }|                                D ]\  }}|                    ||           | j                             |           dS dS )z$Set the environment on the QProcess.N)rE   processEnvironmentitemsinsertsetProcessEnvironment)r   rO   	q_environkvs        r   rF   zProcessWorker._set_environment   sw     	;88::I ' '1  A&&&&M//	:::::		; 	;r   c                     | j                                         }t          ||                                           }| j        || _        n| xj        |z  c_        | j                            | |d           dS )zCallback for partial output.N)rE   readAllStandardOutputr   rY   rC   sig_partialr'   )r   
raw_stdoutstdouts      r   rL   zProcessWorker._partial   sy    ]88::
":t/A/A/C/CDD'#)D    F*  dFD11111r   c                     | j         s=| j                                        t          j        k    r|                                  dS | j        r| j                                         dS dS )zCallback for communicate.N)	rB   rE   stater   
NotRunningcommunicaterA   rD   stopr"   s    r   rJ   zProcessWorker._communicate   so    ' 	##%%)<<<[ 	K	 	r   c                 
   d| _         | j                            d           |                                 }| j        *| j                                        }t          ||          }n| j        }| j                                        }t          ||          }|                    |          |                    |          g}d|d<   || _	        | j
        s(| j                            | |d         |d                    d| _
        |S )zRetrieve information.T  N r   )rB   rE   waitForFinishedrY   rC   rc   r   readAllStandardErrorencoder?   rA   r.   r'   )r   rW   re   rf   
raw_stderrstderrresults          r   rj   zProcessWorker.communicate   s    "&%%d+++!!##'<<>>J&z488FF)F]7799
":t44--%%v}}T':':;r
{ 	@""4F2J???r   c                     | j                                          | j                                         | j                            d           dS )zClose the running process.  N)rD   rk   rE   closerp   r"   s    r   rx   zProcessWorker.close   sF    %%d+++++r   c                 ^    | j                                         t          j        k    o| j        S )z.Return True if worker has finished processing.)rE   rh   r   ri   rA   r"   s    r   r#   zProcessWorker.is_finished   s%    }""$$(;;KKr   c                     | j         sUd| _        | j                            | j        d         | j        dd                    | j                                         dS dS )zStart process.Nr      )rA   _partial_ouputrE   r(   r@   rD   r"   s    r   r3   zProcessWorker._start   sb    { 	 "&DMq 14>!""3EFFFK	  	 r   c                    | j                                          | j                                        t          j        k    rE	 | j                                         | j                            d           n# t          $ r Y nw xY wd| _	        dS )zTerminate running processes.rw   TN)
rD   rk   rE   rh   r   Runningrx   rp   r-   rA   r"   s    r   r+   zProcessWorker.terminate   s    =  H$444##%%%--d3333   s   3A6 6
BBc                 Z    | j         s#| j                            |            d| _         dS dS )zStart worker.TNr%   r"   s    r   r(   zProcessWorker.start   r)   r   N)r4   r5   r6   r7   r	   r8   r&   r.   rd   r   rY   rF   rL   rJ   rj   rx   r#   r3   r+   r(   r9   r:   s   @r   r<   r<   W   s       AA&..K6&&&11L&00KE E E E E E6  ; ; ;
2 
2 
2    6, , ,L L L     	 	 	! ! ! ! ! ! !r   r<   c                   L     e Zd ZdZd fd	Zd ZddZd ZddZd	 Z	d
 Z
 xZS )WorkerManager*Spyder Worker Manager for Generic Workers.
   c                 :   t                                                       t                      | _        t                      | _        g | _        g | _        t          |           | _        t          |           | _	        d| _
        || _        t                      | _        | j                            d           | j        j                            | j                   | j	                            d           | j	        j                            | j                   dS )r   r   iM  rm   N)r   r   r   _queue_queue_workers_threads_workersr   rD   _timer_worker_delete_running_threads_max_threads_bag_collectorrG   rH   rI   r3   _clean_workers)r   max_threadsr   s     r   r   zWorkerManager.__init__   s    gg#ggTll$*4LL! !' $gg$$$##DK000!--d333!)11$2EFFFFFr   c                     | j         r | j                                          | j          | j                                         dS )z+Delete periodically workers in workers bag.N)r   popleftr   rk   r"   s    r   r   zWorkerManager._clean_workers   sJ    ! 	*''))) ! 	*!&&(((((r   Nc                     |r| j                             |           | j         r2| j        | j        k     r!| xj        dz  c_        | j                                         }t          d          }t          |t                    rh|                    |           |j	        
                    |j                   |j        
                    |j                   |                                 nQt          |t                    r<|                                 |                                 |                                 | j                            |           n| j                                         | j        rR| j        D ]J}|                                r4| j                            |           | j                            |           K| j        rH| j        D ]@}|                                r*| j                            |           | xj        dz  c_        At1          | j                  dk    rLt1          | j                  dk    r6| j                                         | j                                         dS dS dS )z-Start threads and check for inactive workers.r{   Nr   )r   appendr   r   r   r   r   r   moveToThreadr.   rI   quitstartedr3   r(   r<   waitr   rD   r   r#   r   remove
isFinishedlenrk   r   )r   workerthreadwts        r   r3   zWorkerManager._start   sR    	/&&v... 	 4#84;L#L#L !!Q&!!(0022FT]]F&,//  ##F+++#++FK888&&v}555FM22  M  ((((K= 	,] , ,==?? ,'..q111M((+++= 	/] / /<<>> /M((+++))Q.))t}""s4='9'9Q'>'>K%++----- #"'>'>r   c                 R    t          |||          }|                     |           |S )z$Create a new python worker instance.)r   _create_worker)r   r   r   r   r   s        r   create_python_workerz"WorkerManager.create_python_worker)  s,    dD&11F###r   c                 T    t          | ||          }|                     |           |S )z%Create a new process worker instance.)rO   )r<   r   )r   rN   rO   r   s       r   create_process_workerz#WorkerManager.create_process_worker/  s/    tXw???F###r   c                     | j         D ]}|                                 | j        D ];}	 |                                 |                                 ,# t
          $ r Y 8w xY wt                      | _        dS )zTerminate all worker processes.N)r   r+   r   r   r   r-   r   r   )r   r   r   s      r   terminate_allzWorkerManager.terminate_all5  s    m 	 	Fm 	 	F    $ggs   (A
AAc                 x    |j                             | j                   | j                            |           dS )zCommon worker setup.N)r&   rI   r3   r   r   )r   r   s     r   r   zWorkerManager._create_workerC  s7    ""4;///V$$$$$r   )r   r   )r4   r5   r6   r7   r   r   r3   r   r   r   r   r9   r:   s   @r   r   r      s        44G G G G G G*) ) )). ). ). ).V     & & &% % % % % % %r   r   c                 (    t          | ||           dS )zPrint worker output for tests.N)print)r   r1   r0   s      r   ready_printr   J  s    	&&%     r   r   c                 j    ddl }|                    |           ||                    |            dS | S )z5This methods illustrates how the workers can be used.r   N)timesleepput)argsecsresult_queuer   s       r   sleeping_funcr   O  sB    KKKJJt
r   c                     ddl m}   |             }t          d          }t          d          D ]e}|                    t
          d                    |          d          }|j                            t                     |
                                 f|                    t
          d	d          }|j                            t                     |
                                 |                    g d
          }|j                            t                     |
                                 t          j        |                                           dS )zMain local test.r   )qapplication   )r      zBOOM! {}   )r   zBOOM!)condainfoz--jsonN)spyder.utils.qthelpersr   r   ranger   r   formatr.   rI   r   r(   r   sysexitexec_)r   appwmir   s        r   
local_testr   Y  s5   333333
,..C	1	%	%	%B1XX  ((
8I8I!8L8L./ ) 1 1##K000$$]G!$DDF
,,,
LLNNN%%&A&A&ABBF
,,,
LLNNN HSYY[[r   __main__)r   N)r7   collectionsr   osr   qtpy.QtCorer   r   r   r   r   r	   spyder.py3compatr
   namerR   r   r   r<   r   r   r   r   r4    r   r   <module>r      s          				 



! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! , + + + + + 	go2 2 2/! /! /! /! /!7 /! /! /!dF! F! F! F! F!G F! F! F!Rf% f% f% f% f%G f% f% f%T! ! !
     . zJLLLLL r   