B
    EDba  ã               @   s¦   d dl mZmZ d dlZd dlm  mZ d dlmZ eƒ a	eƒ a
g g i dœad add„ Zdd„ Zd	d
„ Zdd„ Zdd„ Zdd„ ZG dd„ deƒZG dd„ deƒZdS )é    )ÚLockÚThreadN)Úsha1)ÚrunningÚdoneÚthread_infoc              C   sF   t  ¡  td7 at  ¡  tƒ } |  tt ¡ ƒ d¡t	tƒ ¡ |  
¡ S )Né   zutf-8)Úthread_id_lockerÚacquireÚthread_id_counterÚreleaser   ÚupdateÚstrÚtimeÚencodeÚbytesZ	hexdigest)Útask_id© r   ú<G:\easytimepro\master/mysite/ladon\tools\threadmanagement.pyÚnext_task_id   s     r   c          
   C   sÂ   t  ¡  |rb| td kr¶td  | g7  < ytd  | ¡ W q¶ tk
r^ } zW d d }~X Y q¶X nT| td kr¶td  | g7  < ytd  | ¡ W n" tk
r´ } zW d d }~X Y nX t  ¡  d S )Nr   r   )Úcommon_lockr
   Úthread_dictÚremoveÚ
ValueErrorr   )Ú	thread_idr   Úer   r   r   Úupdate_task_state   s    r   c             C   s    t  ¡  | td k}t  ¡  |S )Nr   )r   r
   r   r   )r   r   r   r   r   Útask_running2   s    r   c             C   s<   t  ¡  | td kr i td | < |td |  |< t  ¡  d S )Nr   )r   r
   r   r   )r   ÚkeyÚvaluer   r   r   Úset_task_info:   s
    r    c             C   sP   d}t  ¡  | td krDytd |  |= d}W n tk
rB   Y nX t  ¡  |S )NFr   T)r   r
   r   ÚKeyErrorr   )r   r   Úsuccessr   r   r   Úremove_task_infoC   s    r#   c             C   s,   t  ¡  td  | i ¡ |d ¡}t  ¡  |S )Nr   )r   r
   r   Úgetr   )r   r   Úvalr   r   r   Úget_task_infoQ   s    r&   c               @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚThreadedTaskContextc             C   s
   || _ d S )N)r   )Úselfr   r   r   r   Ú__init__[   s    zThreadedTaskContext.__init__c             C   s   t | j|ƒ d S )N)r   r   )r(   r   r   r   r   r   ^   s    z%ThreadedTaskContext.update_task_statec             C   s
   t | jƒS )N)r   r   )r(   r   r   r   r   a   s    z ThreadedTaskContext.task_runningc             C   s   t | j|ƒS )N)r&   r   )r(   r   r   r   r   r&   d   s    z!ThreadedTaskContext.get_task_infoc             C   s   t | j|ƒS )N)r#   r   )r(   r   r   r   r   r#   g   s    z$ThreadedTaskContext.remove_task_infoc             C   s   t | j||ƒ d S )N)r    r   )r(   r   r%   r   r   r   r    j   s    z!ThreadedTaskContext.set_task_infoN)	Ú__name__Ú
__module__Ú__qualname__r)   r   r   r&   r#   r    r   r   r   r   r'   Y   s   r'   c                   sD   e Zd Zdd„ Z‡ fdd„Zdd„ Zdd„ Zd	d
„ Zdd„ Z‡  Z	S )ÚManagedThreadc             O   s   | j r| j |f|ž|Ž d S )N)Úevent_cb)r(   Z
identifierÚargsÚkwr   r   r   Ú
post_evento   s    zManagedThread.post_eventc                s2   t ƒ  d¡| _t| dd ƒs d | _tt| ƒ ¡  d S )Nzutf-8r.   )r   r   r   Úgetattrr.   Úsuperr-   r)   )r(   )Ú	__class__r   r   r)   s   s    zManagedThread.__init__c             C   s   t ‚d S )N)ÚNotImplementedError)r(   r   r   r   Úrun_managedy   s    zManagedThread.run_managedc          
   C   s’   t | jdƒ |  d¡ |  dt ¡ ¡ y|  ¡  W n4   t | jdƒ t d| j| jt 	¡ f ¡ Y nX |  dt ¡ ¡ |  d¡ t | jdƒ d S )NTg        ÚstartFz:Thread ID: %s (%s) failed with the following exception:
%sÚstopg      ð?)
r   r   Úupdate_progressr    r   r6   ÚlogÚwriter4   Zget_traceback)r(   r   r   r   Úrun|   s    

zManagedThread.runc             C   s8   t |ƒtkrd S |dkrd}|dk r(d}|  d|¡ d S )Nr   r   Úprogress)ÚtypeÚfloatr    )r(   r=   r   r   r   r9   Š   s    zManagedThread.update_progressc             C   s   t | j||ƒ d S )N)r    r   )r(   r   r%   r   r   r   r    “   s    zManagedThread.set_task_info)
r*   r+   r,   r1   r)   r6   r<   r9   r    Ú__classcell__r   r   )r4   r   r-   n   s   	r-   )Ú	threadingr   r   r   Zladon.tools.logZtoolsr:   Zhashlibr   r	   r   r   r   r   r   r   r    r#   r&   Úobjectr'   r-   r   r   r   r   Ú<module>   s"   
	