
    n%@ej%                        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j'        e(          Z)ed             Z* G d d          Z+ddZ,d Z-d Z.ddl%m/Z/ ddl m!Z!  G d de/          Z0 G 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               #   n   K   	 d V  d S # t           $ r } t                              |             d } ~ ww xY wN)	Exceptionlogger	exception)es    )lib/python3.11/site-packages/partd/zmq.py	logerrorsr       sN         s   
 
4/4c                   ^    e Zd Z	 	 ddZd Zd Zd Zd Zdd	Zd
 Z	d Z
d Zd Zd Zd ZdS )ServerNTFc                 x   t          j                    | _        |(t          t	                      t                                }|| _        | j                            t           j                  | _        |t          j	                    }t          |t                    r|                                }|| j                            d          }nU| j                            |           t          |                    d          d                             d                    }d||fz                                  | _        d| _        | j        j                                         t-                      | _        t-                      | _        |r|                                  |r|                                  d S d S )Nztcp://*:/ztcp://%s:%dcreated)zmqContextcontextr   r   r   partdsocketROUTERgethostname
isinstancestrencodebind_to_random_portbindintsplitrstripaddressstatuslockacquirer   _lock_socket_lockstartblock)selfr+   r3   r=   r>   hostnameports          r   __init__zServer.__init__&   sc   {}}=466466**E
l))#*55)++HdC   	!;;==D<;229==DDKT"""tzz#r*11#6677D%4(88@@BB
!!!VV
 FF 	JJLLL 	JJLLLLL	 	    c                     | j         dk    r\d| _         t          | j                  | _        | j                                         t
                              d| j                   d S d S )Nrun)targetzStart server at %s)r8   r   listen_listen_threadr=   r   debugr7   r?   s    r   r=   zServer.startF   se    ;%DK"("<"<"<D%%'''LL-t|<<<<<	  rC   c                 \    	 | j                                          dS # t          $ r Y dS w xY w)z Block until all threads close N)rH   joinAttributeErrorrJ   s    r   r>   zServer.blockM   sD    	$$&&&&& 	 	 	DD	s    
++c                 F   t                      5  t                              d| j                   | j        dk    rM| j                            d          s'| j        5  | j                                        }d d d            n# 1 swxY w Y   |d         |d         |dd          }}}t                              d||           |dk    r8t                              d	           | 	                    |           d| _        n|d
k    r|d d d         |dd d         }}t          t          t          |                    }t          t          ||                    }| j                            |d           t                              dt#          |                     | 	                    |           n|dk    rH|\  }}t          |          }| j                            ||d           | 	                    |           nv|dk    rt          t          t          |                    }t                              d|           |                     |          }	|                     ||	           | 	                    |d           n|dk    rqt          t          t          |                    }t                              d|           | j                            |d           | 	                    |d           ny|dk    r| 	                    |           n]|dk    r*|                                  | 	                    |           n-t                              d|           t/          d|z             | j        dk    Md d d            d S # 1 swxY w Y   d S )NzStart listening %sclosedd   r   r      zServer receives %s %s   closeServer closes   appendFr9   Server appends %d keys   iset   getzget %s)flow_control   deletez	delete %s   syn   dropzUnknown command: %szUnknown command: )r    r   rI   r7   r8   r,   pollr<   recv_multipartacklistmapdeserialize_keydictzipr+   appendlenisetgetsend_to_clientdeletedrop
ValueError)
r?   payloadr7   commandkeysvaluesdatakeyvalueresults
             r   rG   zServer.listenT   s   [[ 6	D 6	DLL-t|<<<+)){'',, & ; ;"k88::G; ; ; ; ; ; ; ; ; ; ; ; ; ; ; -4AJ
GABBK'4gwGGGh&&LL111HHW%%%"*DK 	))#*33Q3<A&DOT : :;;DD& 1 122DJ%%d%777LL!93t99EEEHHW%%%%''!(JC)#..CJOOCUO;;;HHW%%%%&&OW = =>>DLL4000!XXd^^F''888HHW5H9999	))OW = =>>DLLd333J%%d%777HHW5H9999&&HHW%%%%''IIKKKHHW%%%% LL!6@@@$%87%BCCCi +))6	D 6	D 6	D 6	D 6	D 6	D 6	D 6	D 6	D 6	D 6	D 6	D 6	D 6	D 6	D 6	D 6	D 6	Ds7   ANB8NB	NB	K=NNNc                     t                      5  t          |t                    s|g}| j        5  | j                            |g|z              d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S r   )r    r/   r`   r<   r,   send_multipart)r?   r7   rt   s      r   ri   zServer.send_to_client   s   [[ 	? 	?fd++ " " ? ?**G9v+=>>>? ? ? ? ? ? ? ? ? ? ? ? ? ? ?	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	?s4    A2AA2A	A2!A	"A22A69A6c                     t                      5  t                              d           |                     |d           d d d            d S # 1 swxY w Y   d S )NzServer sends ack   ack)r    r   rI   ri   )r?   r7   rY   s      r   r_   z
Server.ack   s    [[ 	1 	1LL+,,,000	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1s   1AAAc                     | j                             |d           t                              dt	          |                     d S )NFrU   rV   )r+   re   r   rI   rf   )r?   rq   s     r   re   zServer.append   s>    
$U+++-s4yy99999rC   c                     t                      5  | j                                         d d d            d S # 1 swxY w Y   d S r   )r    r+   rk   rJ   s    r   rk   zServer.drop   s    [[ 	 	JOO	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   6::c                    t                      5  t                              d|           | j        5  | j                            |d          }d d d            n# 1 swxY w Y   |cd d d            S # 1 swxY w Y   d S )NzServer gets keys: %sFrU   )r    r   rI   r;   r+   rh   )r?   ro   rt   s      r   rh   z
Server.get   s    [[ 	 	LL/666 : :599: : : : : : : : : : : : : : :		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s4   #A4AA4A	A4"A	#A44A8;A8c                    t                               d           d| _        |                                  t	          t
          j        j                  5  | j        	                    d           d d d            n# 1 swxY w Y   t	          t
          j        j                  5  | j
                            d           d d d            n# 1 swxY w Y   | j        j                                         d S )NrS   rO   r      )r   rI   r8   r>   r   r(   errorZMQErrorr,   closer*   destroyr+   r9   releaserJ   s    r   r   zServer.close   s@   _%%%

ci()) 	! 	!Ka   	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	!ci()) 	$ 	$L  ###	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$
!!!!!s$   A;;A?A?$CCCc                 .    |                                   | S r   )r=   rJ   s    r   	__enter__zServer.__enter__   s    

rC   c                 L    |                                    | j        j        |  d S r   )r   r+   __exit__r?   argss     r   r   zServer.__exit__   s'    


T""""rC   )NNTFN)T)__name__
__module____qualname__rB   r=   r>   rG   ri   r_   re   rk   rh   r   r   r    rC   r   r"   r"   %   s        @E   @= = =  7D 7D 7Dr? ? ?1 1 1 1
: : :    " " "  # # # # #rC   r"   皙?順 c                    t          t          t          |           dz  d          |                                 d          }t	          |                                           }t          |t          dt          t          t          t          t          d|                              ||z                                }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']
    rQ   r   rr   c                     g | ]\  }}|S r   r   ).0kvs      r   
<listcomp>z!keys_to_flush.<locals>.<listcomp>   s    )))DAqa)))rC   N)r	   maxrf   itemssumrp   minr   r`   r   r   r
   )lengthsfractionmaxcounttoptotalcutoffrt   s          r   keys_to_flushr      s     s3w<<1$a((}}  C   !!E3q$z#uQ}}==>>(*, ,- - . .F *)CL)))FMMMMrC   c                 H   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_seprL   ra   serialize_keybytesr0   r1   r   s    r   r   r      s     #u 7~~c-55666#u 
#s zz||s88??rC   c                 f    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   r5   )texts    r   rb   rb      s.     DTZZ	**+++rC   )	Interfacec                   f    e Zd ZddZd Zd ZddZddZdd	Zdd
Z	d Z
d Zd Zd Zd Zd ZdS )ClientNFc                 ~   || _         t          j                    | _        | j                            t          j                  | _        t                              d|           | j                            |           | 	                    dg d           t                      | _        t          j        |            d S )NzClient connects to %sr[   F)ack_required)r7   r(   r)   r*   r,   DEALERr   rI   connectsendNotALockr9   r   rB   )r?   r7   create_serverkwargss       r   rB   zClient.__init__   s    {}}l))#*55,g666G$$$		&"5	111JJ	4     rC   c                     d| j         iS )Nr7   )r7   rJ   s    r   __getstate__zClient.__getstate__   s    4<((rC   c                 p    |                      |d                    t                              d           d S )Nr7   z%Reconstruct client from pickled state)rB   r   rI   )r?   states     r   __setstate__zClient.__setstate__   s2    eI&'''<=====rC   Tc                     |r"| j                                         }|dgk    sJ t                              d|           | j                             |g|z              |r| j                                         }nd }|S )Nrx   zClient sends command: %s)r,   r^   r   rI   rv   )r?   rn   rm   recvr   r_   rt   s          r   r   zClient.send  s     	#+,,..C6(????/999""G9w#6777 	[//11FFFrC   c                     t                               d| j        |           t          t	          t
          |                    }|                     d|d          S )zP

        Lock argument is ignored.  Everything is sequential (I think)
        zClient gets %s %srX   T)r   )r   rI   r7   r`   ra   r   r   r?   ro   r9   s      r   _getzClient._get  sL    
 	($,===Ct,,--yyDy111rC   c           	      >   t                               d| j        t          t	          |                    dz              t          t          |          }t          t          j	        |
                                                    }|                     d|           d S )NzClient appends %s %s keysrT   )r   rI   r7   r0   rf   r   r   r`   r   from_iterabler   r   )r?   rq   r9   rm   s       r   re   zClient.append  su    +T\3s4yy>>G;STTTmT**u*4::<<8899		)W%%%%%rC   c           	          t                               d| j        t          t	          |                    dz              t          t          t          |                    }|                     d|           d S )NzClient deletes %s %sr   rZ   )	r   rI   r7   r0   rf   r`   ra   r   r   r   s      r   _deletezClient._delete  s]    +T\3s4yy>>G;STTTCt,,--		)T"""""rC   c                 P    |                      dt          |          |g           d S )NrW   )r   r   )r?   rr   rs   s      r   _isetzClient._iset$  s)    		'M#..677777rC   c                 P    |                      dg            t          d           d S )Nr\   g?)r   r   rJ   s    r   rk   zClient.drop'  s%    		'2drC   c                 2    |                      dg            d S )NrR   )r   rJ   s    r   close_serverzClient.close_server+  s    		(BrC   c                 .   t          | d          rct          t          j        j                  5  |                                  d d d            n# 1 swxY w Y   | j                                         t          t          j        j                  5  | j        	                    d           d d d            n# 1 swxY w Y   t          t          j        j                  5  | j
                            d           d d d            d S # 1 swxY w Y   d S )Nserver_processr   )hasattrr   r(   r~   r   r   r   rL   r,   r   r*   r   rJ   s    r   r   zClient.close.  s   4)** 	'#),-- $ $!!###$ $ $ $ $ $ $ $ $ $ $ $ $ $ $$$&&&ci()) 	! 	!Ka   	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	!ci()) 	$ 	$L  ###	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$s5   AAAB99B= B="D

DDc                 V    |                                   |                                  d S r   )rk   r   )r?   typers   	tracebacks       r   r   zClient.__exit__8  s     		

rC   c                 .    |                                   d S r   )r   rJ   s    r   __del__zClient.__del__<  s    

rC   )NF)FTr   )r   r   r   rB   r   r   r   r   re   r   r   rk   r   r   r   r   r   rC   r   r   r      s        ! ! ! !) ) )> > >
 
 
 
2 2 2 2& & & &# # # #
8 8 8       $ $ $      rC   r   c                   &    e Zd Zd Zd Zd Zd ZdS )r   c                     d S r   r   rJ   s    r   r:   zNotALock.acquireA        rC   c                     d S r   r   rJ   s    r   r   zNotALock.releaseB  r   rC   c                     | S r   r   rJ   s    r   r   zNotALock.__enter__D  s    rC   c                     d S r   r   r   s     r   r   zNotALock.__exit__G  s    rC   N)r   r   r   r:   r   r   r   r   rC   r   r   r   @  sD              rC   r   )r   r   )2r(   logging	itertoolsr   r   r,   operatorr   r   r   toolzr   r	   r
   r   r   uuidcollectionsr   
contextlibr   r   	threadingr   r   r   multiprocessingr   r   sysrc   r   filer   bufferr    r   r   	getLoggerr   r   r    r"   r   r   rb   r   r   r   r   rC   r   <module>r      s   



                             8 8 8 8 8 8 8 8 8 8 8 8 8 8  # # # # # # / / / / / / / / " " " " " " " "       # # # # # #     



                         			8	$	$   S# S# S# S# S# S# S# S#l   (  "              K K K K KY K K K\         rC   