ó
ë™xTc           @   sf  d  d l  m Z d  d l m Z d  d l Z d  d l Z d  d l Z d e f d „  ƒ  YZ d e j	 f d „  ƒ  YZ
 d e j	 f d	 „  ƒ  YZ d
 e j f d „  ƒ  YZ d e j f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d „  Z d „  Z d „  Z d „  Z d d e d „ Z d S(   iÿÿÿÿ(   t   division(   t   communicationNt   SchedulerActorc           B   s)   e  Z d  Z d „  Z d „  Z d „  Z RS(   sO   
  Interface to a scheduling.Manager object that is polled by another thread
  c         C   sw   | |  _  | |  _ t j ƒ  |  _ t j ƒ  |  _ i  |  _ t |  _ t j	 d |  j
 ƒ |  _ t |  j _ |  j j ƒ  d  S(   Nt   target(   t   managert   waittimet   Queuet   jobs_int   jobs_outt   identifier_fort   Truet   activet	   threadingt   Threadt   runt   daemont   start(   t   selfR   R   (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/remote.pyt   __init__   s    				c         C   sÓ  xc|  j  re|  j j ƒ  x— |  j j r² |  j j d } | j |  j k sP t ‚ y* |  j j |  j | j | f d t	 ƒWn t
 j k
 r‘ Pn X|  j j j ƒ  |  j | j =q Wx� t rBy( |  j j d t	 ƒ \ } \ } } } Wn t
 j k
 rû Pn X|  j j d | d | d | ƒ } | |  j k s2t ‚ | |  j | <q¶ W|  j j s t j |  j ƒ q q W|  j j ƒ  xY |  j j D]K } | j |  j k sžt ‚ |  j j |  j | j | f ƒ |  j | j =q€Wd  S(   Ni    t   blockR   t   argst   kwargs(   R   R   t   pollt   completed_resultst
   identifierR	   t   AssertionErrorR   t   putt   FalseR   t   Fullt   popleftR
   R   t   gett   Emptyt   submitt   timet   sleepR   t   joint   results(   R   t   currentR   R   R   R   t   it   result(    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/remote.pyR      s8    		(! c         C   s   t  |  _ |  j j ƒ  d  S(   N(   R   R   R   R#   (   R   (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/remote.pyt   shutdownG   s    	(   t   __name__t
   __module__t   __doc__R   R   R(   (    (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/remote.pyR   	   s   		+t
   SubmitJobsc           B   s    e  Z d  Z d „  Z d „  Z RS(   s    
  Request for job submission
  c         C   s   | |  _  d  S(   N(   t	   job_infos(   R   R-   (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/remote.pyR   R   s    c         C   s4   x- |  j  D]" \ } } | j j | | f ƒ q
 Wd  S(   N(   R-   R   R   (   R   t   environmentR   t	   callparms(    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/remote.pyt   processW   s    (   R)   R*   R+   R   R0   (    (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/remote.pyR,   M   s   	t   GetJobsc           B   s   e  Z d  „  Z RS(   c         C   sU   g  } xH t  rP y | j j d t ƒ } Wn t j k
 r? Pn X| j | ƒ q	 W| S(   NR   (   R
   R   R   R   R   R   t   append(   R   R.   t   jobst   jres(    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/remote.pyR0   _   s    	(   R)   R*   R0   (    (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/remote.pyR1   ]   s   t   SchedulerServerc           B   s   e  Z d  Z d d „ Z RS(   s   
  Server-side component
  gš™™™™™¹?c         C   s8   t  t |  ƒ j d | d | d t d | d | ƒ ƒ d  S(   Nt   instreamt	   outstreamR.   R   R   (   t   superR5   R   R   (   R   R6   R7   R   R   (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/remote.pyR   t   s    (   R)   R*   R+   R   (    (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/remote.pyR5   o   s   t   SchedulerClientc           B   se   e  Z d  Z d d d d „ Z d „  Z d „  Z d „  Z d „  Z d	 „  Z d
 „  Z	 d i  d „ Z
 RS(   sD   
  Client-side connection to a potentially remote SchedulerServer
  i   g      à?i   c         C   sw   t  t |  ƒ j d | d | ƒ t ƒ  |  _ i  |  _ g  |  _ | |  _ | |  _ t	 j	 ƒ  |  _
 |  j
 |  _ | |  _ d  S(   NR6   R7   (   R8   R9   R   t   sett   runningt
   result_fort   waitingR   t
   submittimeR!   t   polltimet   enqueuetimet   poolsize(   R   R6   R7   R   R>   RA   (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/remote.pyR   ‚   s    				c         C   s   | |  j  k p | |  j k S(   N(   R;   R<   (   R   R   (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/remote.pyt   is_known’   s    c         C   sq   |  j  d | ƒ s t ‚ |  j s4 t j ƒ  |  _ n  |  j j | | | | f f ƒ |  j j | ƒ |  j ƒ  d  S(   NR   (	   RB   R   R=   R!   R@   R2   R;   t   addR   (   R   R   R   R   R   (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/remote.pyR    —   s    	c         C   s   |  j  ƒ  | |  j k S(   N(   R   R<   (   R   R   (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/remote.pyt   is_alive£   s    
c         C   s   |  j  | S(   N(   R<   (   R   R   (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/remote.pyt
   get_result©   s    c         C   s   |  j  | =d  S(   N(   R<   (   R   R   (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/remote.pyt   remove®   s    c         C   sp  t  j  ƒ  } |  j rÎ |  j | |  j k  s: | |  j k  rÎ |  j d t ƒ  ƒ } | ƒ  } x[ | D]S \ } } | |  j k s€ t ‚ |  j j | ƒ | |  j k s¥ t ‚ | |  j | <q_ Wt  j  ƒ  } | |  _ n  |  j	 t
 |  j ƒ k s|  j rl|  j | |  j k  s| |  j k  rl|  j d t d |  j ƒ ƒ } y | ƒ  Wn  t k
 r_} t d | ‚ n Xg  |  _ n  d  S(   Nt   commandR-   s   Submission failure: %s(   R!   R;   R   R?   t   sendR1   R   RF   R<   RA   t   lenR=   R>   R@   R,   t	   Exceptiont   RuntimeError(   R   t   nowt   responseR3   R   t   valuet   e(    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/remote.pyR   ³   s(    .		%c      	   C   s   t  d |  d | d | d | ƒ S(   Nt   handlerR   R   R   (   t   Job(   R   R   R   R   (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/remote.pyRQ   ×   s
    (    (   R)   R*   R+   R   RB   R    RD   RE   RF   R   RQ   (    (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/remote.pyR9   }   s   						$t   PreSubmissionStatusc           B   s,   e  Z d  Z e d „  ƒ Z e d „  ƒ Z RS(   s+   
  A job that has not been submitted yet
  c      	   C   s>   |  j  j d |  j d |  j d |  j d |  j ƒ t |  _ d  S(   NR   R   R   R   (   RP   R    t   nameR   R   R   t   RunningStatust   status(   t   job(    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/remote.pyR   æ   s    			
c         C   s   t  d ‚ d  S(   Ns   job has not been submitted yet(   RK   (   RV   (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/remote.pyRD   ó   s    (   R)   R*   R+   t   staticmethodR   RD   (    (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/remote.pyRR   á   s   RT   c           B   s,   e  Z d  Z e d „  ƒ Z e d „  ƒ Z RS(   s#   
  A job that has been submitted
  c         C   s   t  d ‚ d  S(   Ns   start called second time(   RK   (   RV   (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/remote.pyR   þ   s    c         C   s_   |  j  j d |  j ƒ } | s[ |  j  j d |  j ƒ |  _ |  j  j d |  j ƒ t |  _ n  | S(   NR   (   RP   RD   RS   RE   R'   RF   t   FinishedStatusRU   (   RV   t   alive(    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/remote.pyRD     s    (   R)   R*   R+   RW   R   RD   (    (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/remote.pyRT   ù   s   RX   c           B   s,   e  Z d  Z e d „  ƒ Z e d „  ƒ Z RS(   s#   
  A job that has been submitted
  c         C   s   t  d ‚ d  S(   Ns   start called second time(   RK   (   RV   (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/remote.pyR     s    c         C   s   t  S(   N(   R   (   RV   (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/remote.pyRD     s    (   R)   R*   R+   RW   R   RD   (    (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/remote.pyRX     s   RQ   c           B   sP   e  Z d  Z d i  d „ Z e d „  ƒ Z d „  Z d „  Z d „  Z d „  Z	 RS(   sž   
  Job object to execute function calls on remote machines accessible via
  a network channel

  Restrictions: target, args and kwargs has to be pickleable
  c         C   sC   | |  _  | |  _ | |  _ | |  _ t |  _ d  |  _ d |  _ d  S(   Ni    (	   RP   R   R   R   RR   RU   t   NoneR'   t   exitcode(   R   RP   R   R   R   (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/remote.pyR   *  s    						c         C   s   d t  |  ƒ S(   Ns   remote_job_%d(   t   id(   R   (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/remote.pyRS   7  s    c         C   s   |  j  j d |  ƒ d  S(   NRV   (   RU   R   (   R   (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/remote.pyR   =  s    c         C   s   |  j  j d |  ƒ S(   NRV   (   RU   RD   (   R   (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/remote.pyRD   B  s    c         C   s$   x |  j  ƒ  r t j d ƒ q Wd  S(   Ngš™™™™™¹?(   RD   R!   R"   (   R   (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/remote.pyR#   G  s    c         C   s   d |  j  j |  j f S(   Ns   %s(name = '%s')(   t	   __class__R)   RS   (   R   (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/remote.pyt   __str__M  s    (    (
   R)   R*   R+   R   t   propertyRS   R   RD   R#   R^   (    (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/remote.pyRQ   "  s   			t   RemoteFactoryc           B   s    e  Z d  Z d „  Z d „  Z RS(   sz   
  Remote instance method factory. There is no check that the instance has
  a method passed along with the constructor
  c         C   s/   d d l  m } | d | ƒ |  _ | |  _ d  S(   Niÿÿÿÿ(   t   lazy_initializationt   calculation(   t   libtbx.object_oriented_patternsRa   t   instancet   method(   R   Rb   Re   Ra   (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/remote.pyR   X  s    c         O   s   t  |  j ƒ  |  j ƒ | | Ž  S(   N(   t   getattrRd   Re   (   R   R   R   (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/remote.pyt   __call___  s    (   R)   R*   R+   R   Rg   (    (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/remote.pyR`   R  s   	c         C   s   d d  l  } | j |  d ƒ S(   Niÿÿÿÿi    (   t   picklet   dumps(   t   objRh   (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/remote.pyt   object_to_argumentd  s    c         C   s"   d d  l  } | j |  j d ƒ ƒ S(   Niÿÿÿÿs   string-escape(   Rh   t   loadst   decode(   t   argRh   (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/remote.pyt   argument_to_objectj  s    c         C   s   d |  S(   Ns   %s %r %r %s(    (   t   cmdline(    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/remote.pyt   command_mergep  s    c         C   s   |  S(   N(    (   Rp   (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/remote.pyt   command_unmergeu  s    s   libtbx.remote_processingt   .c         C   s/   | d | t  d |  ƒ t  d | ƒ d | f ƒ S(   NRp   Rj   s   --folder=%s(   Rk   (   t   job_factoryt   queue_factoryt
   executablet   foldert   transformation(    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/remote.pyt   server_process_command_linez  s
    (   t
   __future__R    t   libtbx.queuing_system_utilsR   R   R   R!   t   objectR   t   CommandR,   R1   t   ServerR5   t   ClientR9   RR   RT   RX   RQ   R`   Rk   Ro   Rq   Rr   Ry   (    (    (    sP   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/remote.pyt   <module>   s*   Dd0				