B
    EDb@                 @   s  d dl mZ d dlmZ d dlm  mZ d dlZd dlZd dl	m
Z
mZ d dlmZmZ d dlmZ yd dlZd dlZW n   Y nX eddZG d	d
 d
eZG dd deZefZdeiZG dd deZG dd de
Zdd Zdd Zdd Zdd ZdS )    )	LadonType)PORTABLE_BYTESN)ManagedProcessMultiProcessTaskContext)ManagedThreadThreadedTaskContext)ServerFaultz9unique hash identifying the task to that has been created)typedocc               @   s   e Zd ZeZdS )TaskInfoResponseN)__name__
__module____qualname__task_id_typetask_id r   r   4G:\easytimepro\master/mysite/ladon\types\tasktype.pyr      s   r   c               @   s.   e Zd ZeZeddZeddZeddZdS )TaskProgressResponsezEFloating point value between 0 and 1 denoting the progress in percent)r	   r
   zJFloating point value that informs how long time in seconds the task as runzDThe start time in seconds since the epoch as a floating point numberN)	r   r   r   r   r   floatprogressduration	starttimer   r   r   r   r      s   r   Zrtypec                   s$   e Zd Z fddZdd Z  ZS )ThreadedTaskRunnerc                s$   || _ || _|| _tt|   d S )N)methodargskwsuperr   __init__)selfr   r   r   )	__class__r   r   r   2   s    zThreadedTaskRunner.__init__c          
   C   s   t | j}y8|jd kr*| j| j| j}n| j| j }| d| W nP tk
r } z2| dt	  t
d| j| jt	 f   W d d }~X Y nX d S )Nresult	exceptionz:Thread ID: %s (%s) failed with the following exception:
%s)inspect
getargspecr   keywordsr   r   set_task_info	Exceptionlogget_tracebackwriter   r   )r   argspecsreser   r   r   run_managed8   s    
zThreadedTaskRunner.run_managed)r   r   r   r   r-   __classcell__r   r   )r   r   r   1   s   r   c                   s$   e Zd Z fddZdd Z  ZS )MultiProcessTaskRunnerc                s&   || _ || _|| _tt| | d S )N)r   r   r   r   r/   r   )r   cache_clientr   r   r   )r   r   r   r   H   s    zMultiProcessTaskRunner.__init__c          
   C   s   t | j}yf|jd kr*| j| j| j}n| j| j }t |jt	rd| 
d|| jd n| 
d| W nP tk
r } z2| 
dt  td| j| jt f   W d d }~X Y nX d S )Nr    LADON_METHOD_TCr!   z;Process ID: %s (%s) failed with the following exception:
%s)r"   r#   r   r$   r   r   getmror   countr   r%   __dict__getr&   r'   r(   r)   r   )r   r*   r+   r,   r   r   r   r-   N   s    
z"MultiProcessTaskRunner.run_managed)r   r   r   r   r-   r.   r   r   )r   r   r/   G   s   r/   c             C   sf   d}|  dd}|r2d}tjd||gdd}n0|  dd}|rbd}tj||dd	}tj|d
}|S )zL
    Check if this is a multiprocessing task with cache server attached
    NZLADON_TASKTYPE_MEMCACHE_SERVERi+  z{}:{}r   )debugZLADON_TASKTYPE_REDIS_SERVERi  )ZhostportZdb)Zconnection_pool)r5   memcacheZClientformatredisZConnectionPoolZRedis)r   r0   Zmemcache_serverr7   Zredis_serverZpoolr   r   r   lookup_cache_server`   s    r;   c             O   s^   t |}t| d|d  }|r.t||||}nt|||}|j|d< |  t }|j|_|S )Nz_task_%sZLADON_METHOD_NAMEupdate_progress)r;   getattrr/   r   r<   startr   r   )r   r   r   r0   Ztask_methodZtrZtirr   r   r   task_starters   s    
r?   c             K   s   t |}|rt||}nt|}t }||_|d|_|jd krNtd| |d|_|d}|rl|nt		 |j |_
|S )Nr   z"Task ID: %s does not seem to existr>   stop)r;   r   r   r   r   get_task_infor   r   r   timer   )r   r   r   r0   contextZtprZstoptimer   r   r   task_progress   s    

rD   c             K   s   t |}|rt||}nt|}|d}|rF|d td| ||d}|r|d |d}t|	t
r|||d|dS |S n"| rtd| ntd| d S )	Nr!   z)Error occured while executing task_id: %sr    ZLADON_RTYPEr1   )Z
prime_dictZtcZexport_dictz5Task ID: %s has no result because it is still runningzaTask ID: %s has no result and is not running either. Probably the result has already been fetched)r;   r   r   rA   Zremove_task_infor   r5   r"   r2   r3   r   Ztask_running)r   r   r   r0   rC   excr+   typr   r   r   task_result   s*    




rG   )Zmysite.ladon.types.ladontyper   Zmysite.ladon.compatr   Zladon.tools.logZtoolsr'   r"   rB   Z$mysite.ladon.tools.processmanagementr   r   Z#mysite.ladon.tools.threadmanagementr   r   Zmysite.ladon.exceptions.servicer   r8   r:   r   r   r   ZtaskProgress_argsZtaskProgress_kwr   r/   r;   r?   rD   rG   r   r   r   r   <module>   s0   