ó
‹²,]c           @   s  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 m Z e j d k Z d „  Z d e f d	 „  ƒ  YZ d
 e f d „  ƒ  YZ d e f d „  ƒ  YZ d „  Z d d d „ Z d „  Z e d k re ƒ  n  d S(   sZ   
Worker manager and workers for running files long processes in non GUI
blocking threads.
iÿÿÿÿ(   t   dequeN(   t
   QByteArrayt   QObjectt   QProcesst   QThreadt   QTimert   Signal(   t   PY2t   to_text_stringt   ntc         C   s.   t  |  t ƒ r |  j ƒ  }  n  t |  d | ƒS(   s"   Qt/Python2/3 compatibility helper.t   encoding(   t
   isinstanceR   t   dataR   (   t   objR
   (    (    s3   lib/python2.7/site-packages/spyder/utils/workers.pyt   handle_qbytearray   s    t   PythonWorkerc           B   sY   e  Z d  Z e e ƒ Z e e e e ƒ Z d „  Z d „  Z d „  Z	 d „  Z
 d „  Z RS(   s„   
    Generic python worker for running python code on threads.

    For running processes (via QProcess) use the ProcessWorker.
    c         C   sD   t  t |  ƒ j ƒ  | |  _ | |  _ | |  _ t |  _ t |  _ d S(   s9   Generic python worker for running python code on threads.N(	   t   superR   t   __init__t   funct   argst   kwargst   Falset   _is_finishedt   _started(   t   selfR   R   R   (    (    s3   lib/python2.7/site-packages/spyder/utils/workers.pyR   .   s    				c         C   s   |  j  S(   s@   Return True if worker status is finished otherwise return False.(   R   (   R   (    (    s3   lib/python2.7/site-packages/spyder/utils/workers.pyt   is_finished7   s    c         C   s)   |  j  s% |  j j |  ƒ t |  _  n  d S(   s?   Start the worker (emits sig_started signal with worker as arg).N(   R   t   sig_startedt   emitt   True(   R   (    (    s3   lib/python2.7/site-packages/spyder/utils/workers.pyt   start;   s    	c         C   s   t  |  _ d S(   s   Mark the worker as finished.N(   R   R   (   R   (    (    s3   lib/python2.7/site-packages/spyder/utils/workers.pyt	   terminateA   s    c         C   ss   d } d } y |  j |  j |  j Ž  } Wn t k
 rC } | } n X|  j sf |  j j |  | | ƒ n  t |  _ d S(   s6   Start process worker for given method args and kwargs.N(	   t   NoneR   R   R   t	   ExceptionR   t   sig_finishedR   R   (   R   t   errort   outputt   err(    (    s3   lib/python2.7/site-packages/spyder/utils/workers.pyt   _startE   s    
	(   t   __name__t
   __module__t   __doc__R   t   objectR   R!   R   R   R   R   R%   (    (    (    s3   lib/python2.7/site-packages/spyder/utils/workers.pyR   %   s   					t   ProcessWorkerc           B   s¤   e  Z d  Z e e ƒ Z e e e e ƒ Z e e e e ƒ Z d d „ Z	 d „  Z
 d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d	 „  Z d
 „  Z d „  Z RS(   s7   Process worker based on a QProcess for non blocking UI.c         C   s®   t  t |  ƒ j ƒ  d |  _ | |  _ t |  _ t |  _ d |  _	 t |  _
 t ƒ  |  _ t ƒ  |  _ |  j | ƒ |  j j d ƒ |  j j j |  j ƒ |  j j j |  j ƒ d S(   sö   
        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,
        i–   N(   R   R*   R   R   t   _resultt	   _cmd_listR   t   _firedt   _communicate_firstt   _partial_stdoutR   R   t   _timerR   t   _processt   _set_environmentt   setIntervalt   timeoutt   connectt   _communicatet   readyReadStandardOutputt   _partial(   R   t   cmd_listt   environ(    (    s3   lib/python2.7/site-packages/spyder/utils/workers.pyR   [   s    						c         C   sA   d } t  r= d d l } t | j j j ƒ  ƒ } d | } n  | S(   s$   Return the encoding/codepage to use.s   utf-8iÿÿÿÿNt   cp(   t   WINt   ctypesR   t   cdllt   kernel32t   GetACP(   R   t   encoR=   t   codepage(    (    s3   lib/python2.7/site-packages/spyder/utils/workers.pyt   _get_encodingv   s    c         C   sY   | rU |  j  j ƒ  } x* | j ƒ  D] \ } } | j | | ƒ q" W|  j  j | ƒ n  d S(   s$   Set the environment on the QProcess.N(   R1   t   processEnvironmentt   itemst   insertt   setProcessEnvironment(   R   R:   t	   q_environt   kt   v(    (    s3   lib/python2.7/site-packages/spyder/utils/workers.pyR2   ƒ   s
    c         C   sh   |  j  j ƒ  } t | |  j ƒ  ƒ } |  j d k r? | |  _ n |  j | 7_ |  j j |  | d ƒ d S(   s   Callback for partial output.N(   R1   t   readAllStandardOutputR   RC   R/   R   t   sig_partialR   (   R   t
   raw_stdoutt   stdout(    (    s3   lib/python2.7/site-packages/spyder/utils/workers.pyR8   ‹   s    c         C   sL   |  j  r/ |  j j ƒ  t j k r/ |  j ƒ  n |  j rH |  j j ƒ  n  d S(   s   Callback for communicate.N(	   R.   R1   t   stateR   t
   NotRunningt   communicateR-   R0   t   stop(   R   (    (    s3   lib/python2.7/site-packages/spyder/utils/workers.pyR6   —   s
    
	c         C   sö   t  |  _ |  j j ƒ  |  j ƒ  } |  j d k rR |  j j ƒ  } t | | ƒ } n	 |  j } |  j j	 ƒ  } t | | ƒ } | j
 | ƒ | j
 | ƒ g } t r¬ | j ƒ  } n  d | d <| |  _ |  j sé |  j j |  | d | d ƒ n  t  |  _ | S(   s   Retrieve information.t    iÿÿÿÿi    N(   R   R.   R1   t   waitForFinishedRC   R/   R   RK   R   t   readAllStandardErrort   encodeR   t   decodeR+   R-   R!   R   (   R   RA   RM   RN   t
   raw_stderrt   stderrt   result(    (    s3   lib/python2.7/site-packages/spyder/utils/workers.pyRQ   Ÿ   s$    		
		!	c         C   s   |  j  j ƒ  d S(   s   Close the running process.N(   R1   t   close(   R   (    (    s3   lib/python2.7/site-packages/spyder/utils/workers.pyR[   ¼   s    c         C   s   |  j  j ƒ  t j k o |  j S(   s.   Return True if worker has finished processing.(   R1   RO   R   RP   R-   (   R   (    (    s3   lib/python2.7/site-packages/spyder/utils/workers.pyR   À   s    c         C   sG   |  j  sC d |  _ |  j j |  j d |  j d ƒ |  j j ƒ  n  d S(   s   Start process.i    i   N(   R-   R   t   _partial_ouputR1   R   R,   R0   (   R   (    (    s3   lib/python2.7/site-packages/spyder/utils/workers.pyR%   Ä   s    		!c         C   sM   |  j  j ƒ  t j k r@ y |  j  j ƒ  Wq@ t k
 r< q@ Xn  t |  _ d S(   s   Terminate running processes.N(   R1   RO   R   t   RunningR   R    R   R-   (   R   (    (    s3   lib/python2.7/site-packages/spyder/utils/workers.pyR   Ë   s    c         C   s)   |  j  s% |  j j |  ƒ t |  _  n  d S(   s   Start worker.N(   R   R   R   R   (   R   (    (    s3   lib/python2.7/site-packages/spyder/utils/workers.pyR   Ô   s    	N(   R&   R'   R(   R   R)   R   R!   RL   R   R   RC   R2   R8   R6   RQ   R[   R   R%   R   R   (    (    (    s3   lib/python2.7/site-packages/spyder/utils/workers.pyR*   T   s   										t   WorkerManagerc           B   sV   e  Z d  Z d d „ Z d „  Z d	 d „ Z d „  Z d	 d „ Z d „  Z	 d „  Z
 RS(
   s*   Spyder Worker Manager for Generic Workers.i
   c         C   sÃ   t  t |  ƒ j ƒ  t ƒ  |  _ t ƒ  |  _ g  |  _ g  |  _ t ƒ  |  _	 t ƒ  |  _
 d |  _ | |  _ t ƒ  |  _ |  j	 j d ƒ |  j	 j j |  j ƒ |  j
 j d ƒ |  j
 j j |  j ƒ d S(   s*   Spyder Worker Manager for Generic Workers.i    iM  iˆ  N(   R   R   R   R    t   _queuet   _queue_workerst   _threadst   _workersR   R0   t   _timer_worker_deletet   _running_threadst   _max_threadst   _bag_collectorR3   R4   R5   R%   t   _clean_workers(   R   t   max_threads(    (    s3   lib/python2.7/site-packages/spyder/utils/workers.pyR   Þ   s    				c         C   s.   x |  j  r |  j  j ƒ  q W|  j j ƒ  d S(   s+   Delete periodically workers in workers bag.N(   Rf   t   popleftRc   RR   (   R   (    (    s3   lib/python2.7/site-packages/spyder/utils/workers.pyRg   ó   s    c         C   sØ  | r |  j  j | ƒ n  |  j  rã |  j |  j k  rã |  j d 7_ |  j  j ƒ  } t ƒ  } t | t ƒ rª | j | ƒ | j	 j
 | j ƒ | j j
 | j ƒ | j ƒ  n& t | t ƒ rÐ | j ƒ  | j ƒ  n  |  j j | ƒ n |  j j ƒ  |  j r?xC |  j D]5 } | j ƒ  r|  j j | ƒ |  j j | ƒ qqWn  |  j rxB |  j D]4 } | j ƒ  rR|  j j | ƒ |  j d 8_ qRqRWn  t |  j ƒ d k rÔt |  j ƒ d k rÔ|  j j ƒ  |  j j ƒ  n  d S(   s-   Start threads and check for inactive workers.i   i    N(   R`   t   appendRd   Re   Ri   R   R   R   t   moveToThreadR!   R5   t   quitt   startedR%   R   R*   Ra   R0   Rb   R   Rf   t   removet
   isFinishedt   lenRR   Rc   (   R   t   workert   threadt   wt   t(    (    s3   lib/python2.7/site-packages/spyder/utils/workers.pyR%   ù   s:    	
		*c         O   s#   t  | | | ƒ } |  j | ƒ | S(   s$   Create a new python worker instance.(   R   t   _create_worker(   R   R   R   R   Rq   (    (    s3   lib/python2.7/site-packages/spyder/utils/workers.pyt   create_python_worker#  s    c         C   s#   t  | d | ƒ} |  j | ƒ | S(   s%   Create a new process worker instance.R:   (   R*   Ru   (   R   R9   R:   Rq   (    (    s3   lib/python2.7/site-packages/spyder/utils/workers.pyt   create_process_worker)  s    c         C   s.   x |  j  D] } | j ƒ  q
 Wt ƒ  |  _ d S(   s   Terminate all worker processes.N(   Rb   R   R    R`   (   R   Rq   (    (    s3   lib/python2.7/site-packages/spyder/utils/workers.pyt   terminate_all/  s    c         C   s'   | j  j |  j ƒ |  j j | ƒ d S(   s   Common worker setup.N(   R   R5   R%   Rb   Rj   (   R   Rq   (    (    s3   lib/python2.7/site-packages/spyder/utils/workers.pyRu   <  s    N(   R&   R'   R(   R   Rg   R   R%   Rv   Rw   Rx   Ru   (    (    (    s3   lib/python2.7/site-packages/spyder/utils/workers.pyR^   Û   s   	*		c         C   s   |  | | f GHd S(   s   Print worker output for tests.N(    (   Rq   R#   R"   (    (    s3   lib/python2.7/site-packages/spyder/utils/workers.pyt   ready_printC  s    i
   c         C   s=   d d l  } | j | ƒ | d k	 r5 | j |  ƒ n |  Sd S(   s5   This methods illustrates how the workers can be used.iÿÿÿÿN(   t   timet   sleepR   t   put(   t   argt   secst   result_queueRz   (    (    s3   lib/python2.7/site-packages/spyder/utils/workers.pyt   sleeping_funcH  s
    c          C   sõ   d d l  m }  |  ƒ  } t d d ƒ } xO t d ƒ D]A } | j t d j | ƒ d d ƒ} | j j t	 ƒ | j
 ƒ  q5 W| j t d	 d d ƒ} | j j t	 ƒ | j
 ƒ  | j d
 d d g ƒ } | j j t	 ƒ | j
 ƒ  t j | j ƒ  ƒ d S(   s   Main local test.iÿÿÿÿ(   t   qapplicationRh   i   i   s   BOOM! {}R~   i   s   BOOM!t   condat   infos   --jsonN(   t   spyder.utils.qthelpersR   R^   t   rangeRv   R€   t   formatR!   R5   Ry   R   Rw   t   syst   exitt   exec_(   R   t   appt   wmt   iRq   (    (    s3   lib/python2.7/site-packages/spyder/utils/workers.pyt
   local_testR  s    		

t   __main__(   R(   t   collectionsR    t   osR‡   t   qtpy.QtCoreR   R   R   R   R   R   t   spyder.py3compatR   R   t   nameR<   R   R   R*   R^   Ry   R   R€   R   R&   (    (    (    s3   lib/python2.7/site-packages/spyder/utils/workers.pyt   <module>   s   .	/‡h	
	