B
    P\%                 @   s  d dl mZmZ 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 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dl(m)Z)m*Z*m+Z+ ddl,m-Z- dZ.e/e0Z1edd Z2G dd de3Z4d&ddZ5dd Z6dd  Z7dd!l'm8Z8 ddl"m#Z# G d"d# d#e8Z9G d$d% d%e3Z:dS )'    )absolute_importprint_functionN)chain)bisect)add)sleeptime)
accumulatetopkpluckmergekeymap)defaultdict)contextmanager)ThreadLock)datetime)Process   )Dict)File)Buffer)core)QueueEmptyunicode)ignorings   -|-c           
   c   s>   y
d V  W n. t k
r8 }  zt|   W d d } ~ X Y nX d S )N)	ExceptionloggerZ	exception)e r    (lib/python3.7/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 kr tt t }|| _| jt j| _|d krFt	 }t
|trX| }|d k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:%dZcreated)zmqContextcontextr   r   r   partdsocketZROUTERZgethostname
isinstancer   encodeZbind_to_random_portbindintsplitrstripaddressstatuslockacquirer   _lock_socket_lockstartblock)selfr*   r.   r8   r9   ZhostnameZ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   J   s
    

zServer.startc             C   s(   y| j   W n tk
r"   Y nX dS )z Block until all threads close N)r?   joinAttributeError)r:   r    r    r!   r9   Q   s    zServer.blockc       
   
   C   s:  t  ( td| j x| jdkr*| jds6q| j | j }W d Q R X |d |d |dd    }}}td|| |dkrtd	 | 	| d| _P 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rN|\}}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 W d Q R X d S )NzStart listening %sclosedd   r   r      zServer receives %s %ss   closezServer closess   appendF)r4   zServer appends %d keyss   isets   getzget %s)flow_controls   deletez	delete %ss   syns   dropzUnknown command: %szUnknown command: )r"   r   r@   r2   r3   r+   Z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>   X   sX    
 








zServer.listenc          
   C   sJ   t  : t|ts|g}| j | j|g|  W d Q R X W d Q R X d S )N)r"   r,   rI   r7   r+   send_multipart)r:   r2   r\   r    r    r!   rQ      s
    
zServer.send_to_clientc          	   C   s,   t   td | |d W d Q R X d S )NzServer sends acks   ack)r"   r   r@   rQ   )r:   r2   rF   r    r    r!   rH      s    
z
Server.ackc             C   s$   | j j|dd tdt| d S )NF)r4   zServer appends %d keys)r*   rN   r   r@   rO   )r:   rY   r    r    r!   rN      s    zServer.appendc          	   C   s    t   | j  W d Q R X d S )N)r"   r*   rS   )r:   r    r    r!   rS      s    zServer.dropc          
   C   sD   t  4 td| | j | jj|dd}W d Q R X |S Q R X d S )NzServer gets keys: %sF)r4   )r"   r   r@   r6   r*   rP   )r:   rW   r\   r    r    r!   rP      s
    z
Server.getc          	   C   sp   t d d| _|   ttjj | j	d W d Q R X ttjj | j
d W d Q R X | jj  d S )NzServer closesrC   r      )r   r@   r3   r9   r   r'   errorZMQErrorr+   closer)   destroyr*   r4   release)r:   r    r    r!   ra      s    
zServer.closec             C   s   |    | S )N)r8   )r:   r    r    r!   	__enter__   s    zServer.__enter__c             G   s   |    | jj|  d S )N)ra   r*   __exit__)r:   argsr    r    r!   re      s    zServer.__exit__)NNTFN)T)__name__
__module____qualname__r;   r8   r9   r>   rQ   rH   rN   rS   rP   ra   rd   re   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 }|stt|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']
    rE   r   )rZ   c             S   s   g | ]\}}|qS r    r    ).0kvr    r    r!   
<listcomp>   s    z!keys_to_flush.<locals>.<listcomp>N)r
   maxrO   itemssumrX   minr   rI   r	   r   r   AssertionError)ZlengthsZfractionZmaxcounttopZtotalcutoffr\   r    r    r!   keys_to_flush   s    rw   c             C   sF   t | trttt| S t | tr(| S t | tr:|  S t|  S )z^

    >>> serialize_key('x')
    'x'
    >>> serialize_key(('a', 'b', 1))
    'a-|-b-|-1'
    )	r,   tuple	tuple_seprA   rJ   serialize_keybytesstrr-   )rZ   r    r    r!   rz      s    


rz   c             C   s   t | krt| t S | S dS )zd

    >>> deserialize_key('x')
    'x'
    >>> deserialize_key('a-|-b-|-1')
    ('a', 'b', '1')
    N)ry   rx   r0   )textr    r    r!   rK      s    rK   )	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 %ss   synF)ack_required)r2   r'   r(   r)   r+   ZDEALERr   r@   ZconnectsendNotALockr4   r~   r;   )r:   r2   Zcreate_serverkwargsr    r    r!   r;      s    
zClient.__init__c             C   s
   d| j iS )Nr2   )r2   )r:   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   r@   )r:   stater    r    r!   __setstate__  s    zClient.__setstate__Tc             C   sR   |r| j  }|dgksttd| | j |g|  |rJ| j  }nd }|S )Ns   ackzClient sends command: %s)r+   rG   rt   r   r@   r]   )r:   rV   rU   recvr   rH   r\   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 %ss   getT)r   )r   r@   r2   rI   rJ   rz   r   )r:   rW   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 %sz keyss   append)r   r@   r2   r|   rO   r   rz   rI   r   from_iterablerq   r   )r:   rY   r4   rU   r    r    r!   rN     s    
zClient.appendc             C   s:   t d| jtt|d  ttt|}| d| d S )NzClient deletes %s %sz keyss   delete)	r   r@   r2   r|   rO   rI   rJ   rz   r   )r:   rW   r4   r    r    r!   _delete#  s    zClient._deletec             C   s   |  dt||g d S )Ns   iset)r   rz   )r:   rZ   r[   r    r    r!   _iset(  s    zClient._isetc             C   s   |  dg  td d S )Ns   dropg?)r   r   )r:   r    r    r!   rS   +  s    zClient.dropc             C   s   |  dg  d S )Ns   close)r   )r:   r    r    r!   close_server/  s    zClient.close_serverc          	   C   s   t | dr4ttjj |   W d Q R X | j  ttjj | j	d W d Q R X ttjj | j
d W d Q R X d S )Nserver_processr   )hasattrr   r'   r_   r`   r   r   rA   r+   ra   r)   rb   )r:   r    r    r!   ra   2  s    

zClient.closec             C   s   |    |   d S )N)rS   ra   )r:   typer[   	tracebackr    r    r!   re   <  s    zClient.__exit__c             C   s   |    d S )N)ra   )r:   r    r    r!   __del__@  s    zClient.__del__)NF)FT)N)N)N)rg   rh   ri   r;   r   r   r   r   rN   r   r   rS   r   ra   re   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 )Nr    )r:   r    r    r!   r5   E  s    zNotALock.acquirec             C   s   d S )Nr    )r:   r    r    r!   rc   F  s    zNotALock.releasec             C   s   | S )Nr    )r:   r    r    r!   rd   H  s    zNotALock.__enter__c             G   s   d S )Nr    )r:   rf   r    r    r!   re   K  s    zNotALock.__exit__N)rg   rh   ri   r5   rc   rd   re   r    r    r    r!   r   D  s   r   )rj   rk   );Z
__future__r   r   r'   Zlogging	itertoolsr   r   r+   operatorr   r   r   Ztoolzr	   r
   r   r   r   Zuuidcollectionsr   
contextlibr   Z	threadingr   r   r   Zmultiprocessingr   r   sysrL   r   filer   bufferr    r   Zcompatibilityr   r   r   Zutilsr   ry   Z	getLoggerrg   r   r"   objectr#   rw   rz   rK   r~   r   r   r    r    r    r!   <module>   sD   
	 
N