o
    Nrfj%                     @   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   s4    zd V  W d S  t y }  zt|   d } ~ ww N)	Exceptionlogger	exception)e r   R/var/www/html/software/conda/envs/catlas/lib/python3.10/site-packages/partd/zmq.py	logerrors   s   
r   c                   @   st   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 r#t	 }t
|tr,| }|d u r7| jd}n| j| t|dd d}d||f  | _d| _| jj  t | _t | _|ri|   |rq|   d S 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rd| _ t| jd| _| j  td| j d S 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 dS  ty   Y dS w )z Block until all threads close N)rA   joinAttributeErrorrC   r   r   r   r9   M   s
   zServer.blockc           
   	   C   s|  t  / td| j | jdkr#| jdsq| j | j }W d    n1 s,w   Y  |d |d |dd  }}}td|| |dkrZtd	 | 	| d| _n|d
kr|d d d |dd d }}t
tt|}tt||}| jj|dd tdt| | 	| n|dkr|\}}t|}| jj||dd | 	| nj|dkrt
tt|}td| | |}	| ||	 | j	|dd nF|dkrt
tt|}td| | jj|dd | j	|dd n%|dkr| 	| n|dkr
|   | 	| ntd| td| | jdksW d    d S W d    d S W d    d S 1 s7w   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   sf   
 



$zServer.listenc              	   C   s   t  5 t|ts|g}| j | j|g|  W d    n1 s#w   Y  W d    d S W d    d S 1 s;w   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   sB   t   td | |d W d    d S 1 sw   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   s6   t   | j  W d    d S 1 sw   Y  d S r   )r   r(   ra   rC   r   r   r   ra      s   "zServer.dropc              	   C   sp   t  + td| | j | jj|dd}W d    n1 s w   Y  |W  d    S 1 s1w   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 s#w   Y  ttjj | j
d W d    n1 s?w   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 }|s:J |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>   s    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 )zj

    >>> deserialize_key(b'x')
    b'x'
    >>> deserialize_key(b'a-|-b-|-1')
    (b'a', b'b', b'1')
    )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   sT   |r| j  }|dgksJ td| | j |g|  |r&| j  }|S 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r$ttjj |   W d    n1 sw   Y  | j  ttjj | j	d W d    n1 s;w   Y  ttjj | j
d W d    d S 1 sXw   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)FTr   )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      d S r   r   rC   r   r   r   r5   A      zNotALock.acquirec                 C   r   r   r   rC   r   r   r   rr   B  r   zNotALock.releasec                 C   s   | S r   r   rC   r   r   r   rs   D     zNotALock.__enter__c                 G   r   r   r   ru   r   r   r   rt   G  r   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>   sB    

 
N