a
    fDfj%                     @   sp  d dl Z d dlZd dlmZ d dlmZ d dlZd dlmZ d dlm	Z	mZ d dl
mZmZmZmZmZ d dlZd dlmZ d dlmZmZ d d	lmZmZ d d
lmZ d dlmZ d dlZd dlZddlmZ ddl m!Z! ddl"m#Z# ddl$m%Z% dZ&e'e(Z)edd Z*G dd dZ+d#ddZ,dd Z-dd Z.ddl%m/Z/ ddl m!Z! G dd  d e/Z0G d!d" d"Z1dS )$    N)chain)bisect)add)sleeptime)
accumulatetopkpluckmergekeymap)defaultdict)contextmanagersuppress)ThreadLock)datetime)Process   )Dict)File)Buffer)cores   -|-c               
   c   s@   z
d V  W n0 t y: }  zt|   W Y d } ~ n
d } ~ 0 0 d S N)	Exceptionlogger	exception)e r   V/nfs/NAS7/SABIOD/METHODE/ermites/ermites_venv/lib/python3.9/site-packages/partd/zmq.py	logerrors   s
    

r   c                   @   sp   e Zd ZdddZdd Zdd	 Zd
d Zdd ZdddZdd Z	dd Z
dd Zdd Zdd Zdd ZdS )ServerNTFc                 C   s   t  | _|d u r tt t }|| _| jt j| _|d u rFt	 }t
|trX| }|d u rn| jd}n$| j| t|dd d}d||f  | _d| _| jj  t | _t | _|r|   |r|   d S )Nztcp://*:/ztcp://%s:%dcreated)zmqContextcontextr   r   r   partdsocketZROUTERgethostname
isinstancestrencodeZbind_to_random_portbindintsplitrstripaddressstatuslockacquirer   _lock_socket_lockstartblock)selfr(   r.   r8   r9   hostnameportr   r   r   __init__&   s,    

zServer.__init__c                 C   s:   | j dkr6d| _ t| jd| _| j  td| j d S )Nrun)targetzStart server at %s)r3   r   listen_listen_threadr8   r   debugr2   r:   r   r   r   r8   F   s
    

zServer.startc                 C   s&   z| j   W n ty    Y n0 dS )z Block until all threads close N)rA   joinAttributeErrorrC   r   r   r   r9   M   s    zServer.blockc           
   	   C   s`  t  B td| j | jdkr<| jds2q| j | j }W d    n1 sX0    Y  |d |d |dd    }}}td|| |dkrtd	 | 	| d| _q<q|d
kr(|d d d |dd d  }}t
tt|}tt||}| jj|dd tdt| | 	| q|dkr`|\}}t|}| jj||dd | 	| q|dkrt
tt|}td| | |}	| ||	 | j	|dd q|dkrt
tt|}td| | jj|dd | j	|dd q|dkr| 	| q|dkr"|   | 	| qtd| td| qW d    n1 sR0    Y  d S )NzStart listening %sclosedd   r   r      zServer receives %s %s   closeServer closes   appendFr4   Server appends %d keys   iset   getzget %s)flow_control   deletez	delete %s   syn   dropzUnknown command: %szUnknown command: )r   r   rB   r2   r3   r)   pollr7   recv_multipartacklistmapdeserialize_keydictzipr(   appendlenZisetgetsend_to_clientdeletedrop
ValueError)
r:   payloadr2   commandkeysvaluesdatakeyvalueresultr   r   r   r@   T   sX    
( 








zServer.listenc              	   C   sr   t  X t|ts|g}| j" | j|g|  W d    n1 sF0    Y  W d    n1 sd0    Y  d S r   )r   r+   rW   r7   r)   send_multipart)r:   r2   rj   r   r   r   r_      s
    
zServer.send_to_clientc                 C   s@   t  & td | |d W d    n1 s20    Y  d S )NzServer sends ack   ack)r   r   rB   r_   )r:   r2   rP   r   r   r   rV      s    
z
Server.ackc                 C   s$   | j j|dd tdt| d S )NFrL   rM   )r(   r\   r   rB   r]   )r:   rg   r   r   r   r\      s    zServer.appendc                 C   s4   t   | j  W d    n1 s&0    Y  d S r   )r   r(   ra   rC   r   r   r   ra      s    zServer.dropc              	   C   sp   t  V td| | j  | jj|dd}W d    n1 s@0    Y  |W  d    S 1 sb0    Y  d S )NzServer gets keys: %sFrL   )r   r   rB   r6   r(   r^   )r:   re   rj   r   r   r   r^      s
    .z
Server.getc                 C   s   t d d| _|   ttjj | j	d W d    n1 sF0    Y  ttjj | j
d W d    n1 s~0    Y  | jj  d S )NrJ   rF   r      )r   rB   r3   r9   r   r%   errorZMQErrorr)   closer'   destroyr(   r4   releaserC   r   r   r   rp      s    
**zServer.closec                 C   s   |    | S r   )r8   rC   r   r   r   	__enter__   s    zServer.__enter__c                 G   s   |    | jj|  d S r   )rp   r(   __exit__r:   argsr   r   r   rt      s    zServer.__exit__)NNTFN)T)__name__
__module____qualname__r=   r8   r9   r@   r_   rV   r\   ra   r^   rp   rs   rt   r   r   r   r   r    %   s     
 9

r    皙?順 c                 C   sx   t tt| d d|  dd}t|  }t|tdttt	t
td||| }dd |d| D }|stJ |S )z Which keys to remove

    >>> lengths = {'a': 20, 'b': 10, 'c': 15, 'd': 15,
    ...            'e': 10, 'f': 25, 'g': 5}
    >>> keys_to_flush(lengths, 0.5)
    ['f', 'a']
    rH   r   rh   c                 S   s   g | ]\}}|qS r   r   ).0kvr   r   r   
<listcomp>       z!keys_to_flush.<locals>.<listcomp>N)r   maxr]   itemssumrf   minr   rW   r   r   r	   )lengthsfractionZmaxcounttoptotalcutoffrj   r   r   r   keys_to_flush   s    r   c                 C   sF   t | trttt| S t | tr(| S t | tr:|  S t|  S )z`

    >>> serialize_key('x')
    b'x'
    >>> serialize_key(('a', 'b', 1))
    b'a-|-b-|-1'
    )	r+   tuple	tuple_seprD   rX   serialize_keybytesr,   r-   r|   r   r   r   r      s    


r   c                 C   s   t | v rt| t S | S dS )zj

    >>> deserialize_key(b'x')
    b'x'
    >>> deserialize_key(b'a-|-b-|-1')
    (b'a', b'b', b'1')
    N)r   r   r0   )textr   r   r   rY      s    rY   )	Interfacec                   @   s~   e Zd ZdddZdd Zdd Zdd
dZd ddZd!ddZd"ddZ	dd Z
dd Zdd Zdd Zdd Zdd ZdS )#ClientNFc                 K   s^   || _ t | _| jtj| _td| | j| | j	dg dd t
 | _t|  d S )NzClient connects to %srR   F)ack_required)r2   r%   r&   r'   r)   ZDEALERr   rB   connectsendNotALockr4   r   r=   )r:   r2   create_serverkwargsr   r   r   r=      s    
zClient.__init__c                 C   s
   d| j iS )Nr2   )r2   rC   r   r   r   __getstate__   s    zClient.__getstate__c                 C   s   |  |d  td d S )Nr2   z%Reconstruct client from pickled state)r=   r   rB   )r:   stater   r   r   __setstate__   s    zClient.__setstate__Tc                 C   sR   |r| j  }|dgksJ td| | j |g|  |rJ| j  }nd }|S )Nrl   zClient sends command: %s)r)   rU   r   rB   rk   )r:   rd   rc   recvr   rV   rj   r   r   r   r     s    
zClient.sendc                 C   s.   t d| j| ttt|}| jd|ddS )zP

        Lock argument is ignored.  Everything is sequential (I think)
        zClient gets %s %srO   T)r   )r   rB   r2   rW   rX   r   r   r:   re   r4   r   r   r   _get  s    zClient._getc                 C   sH   t d| jtt|d  tt|}tt	|
 }| d| d S )NzClient appends %s %s keysrK   )r   rB   r2   r,   r]   r   r   rW   r   from_iterabler   r   )r:   rg   r4   rc   r   r   r   r\     s    
zClient.appendc                 C   s:   t d| jtt|d  ttt|}| d| d S )NzClient deletes %s %sr   rQ   )	r   rB   r2   r,   r]   rW   rX   r   r   r   r   r   r   _delete  s    zClient._deletec                 C   s   |  dt||g d S )NrN   )r   r   )r:   rh   ri   r   r   r   _iset$  s    zClient._isetc                 C   s   |  dg  td d S )NrS   g?)r   r   rC   r   r   r   ra   '  s    zClient.dropc                 C   s   |  dg  d S )NrI   )r   rC   r   r   r   close_server+  s    zClient.close_serverc                 C   s   t | drHttjj |   W d    n1 s40    Y  | j  ttjj | j	d W d    n1 sv0    Y  ttjj | j
d W d    n1 s0    Y  d S )Nserver_processr   )hasattrr   r%   rn   ro   r   r   rD   r)   rp   r'   rq   rC   r   r   r   rp   .  s    
&
*zClient.closec                 C   s   |    |   d S r   )ra   rp   )r:   typeri   	tracebackr   r   r   rt   8  s    zClient.__exit__c                 C   s   |    d S r   )rp   rC   r   r   r   __del__<  s    zClient.__del__)NF)FT)N)N)N)rw   rx   ry   r=   r   r   r   r   r\   r   r   ra   r   rp   rt   r   r   r   r   r   r      s   



	


r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
r   c                 C   s   d S r   r   rC   r   r   r   r5   A  r   zNotALock.acquirec                 C   s   d S r   r   rC   r   r   r   rr   B  r   zNotALock.releasec                 C   s   | S r   r   rC   r   r   r   rs   D  s    zNotALock.__enter__c                 G   s   d S r   r   ru   r   r   r   rt   G  s    zNotALock.__exit__N)rw   rx   ry   r5   rr   rs   rt   r   r   r   r   r   @  s   r   )rz   r{   )2r%   logging	itertoolsr   r   r)   operatorr   r   r   Ztoolzr   r   r	   r
   r   uuidcollectionsr   
contextlibr   r   	threadingr   r   r   multiprocessingr   r   sysrZ   r   filer   bufferr    r   r   	getLoggerrw   r   r   r    r   r   rY   r   r   r   r   r   r   r   <module>   s@   

 
N