
    gj%                        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jN                  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      Z1y)    N)chain)bisect)add)sleeptime)
accumulatetopkpluckmergekeymap)defaultdict)contextmanagersuppress)ThreadLock)datetime)Process   )Dict)File)Buffer)cores   -|-c               #   d   K   	 d  y # t         $ r} t        j                  |         d } ~ ww xY wwN)	Exceptionlogger	exception)es    )lib/python3.12/site-packages/partd/zmq.py	logerrorsr       s.      s   0	 0	-(-0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y)ServerNc                 "   t        j                         | _        |t        t	               t                     }|| _        | j                  j                  t         j                        | _        |t        j                         }t        |t              r|j                         }|| j                  j                  d      }nG| j                  j                  |       t        |j!                  d      d   j#                  d            }d||fz  j                         | _        d| _        | j                  j(                  j+                          t-               | _        t-               | _        |r| j3                          |r| j5                          y y )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__&   s    {{}=4646*E
ll))#**5))+HdC ;;=D<;;229=DKKT"tzz#r*11#67D%4(88@@B

!V
 FJJLJJL     c                     | j                   dk7  r]d| _         t        | j                        | _        | j                  j	                          t
        j                  d| j                         y y )Nrun)targetzStart server at %s)r8   r   listen_listen_threadr=   r   debugr7   r?   s    r   r=   zServer.startF   sP    ;;%DK"("<D%%'LL-t||<	  rC   c                 X    	 | j                   j                          y# t        $ r Y yw xY w)z Block until all threads close N)rH   joinAttributeErrorrJ   s    r   r>   zServer.blockM   s+    	$$& 		s    	))c                 <   t               5  t        j                  d| j                         | j                  dk7  r| j
                  j                  d      s,| j                  5  | j
                  j                         }d d d        d   |d   |dd  }}}t        j                  d||       |dk(  r/t        j                  d	       | j                  |       d| _        n|d
k(  r|d d d   |dd d   }}t        t        t        |            }t        t        ||            }| j                  j!                  |d       t        j                  dt#        |             | j                  |       nx|dk(  rA|\  }}t        |      }| j                  j%                  ||d       | j                  |       n2|dk(  rft        t        t        |            }t        j                  d|       | j'                  |      }	| j)                  ||	       | j                  |d       n|dk(  r`t        t        t        |            }t        j                  d|       | j                  j+                  |d       | j                  |d       nb|dk(  r| j                  |       nK|dk(  r"| j-                          | j                  |       n$t        j                  d|       t/        d|z         | j                  dk7  rd d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)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   [LL-t||<++){{'',&&"kk88:G ' -4AJ
GABK'4gwGh&LL1HHW%"*DK 	)#*3Q3<A&DOT :;DD& 12DJJ%%d%7LL!93t9EHHW%'!(JC)#.CJJOOCUO;HHW%&OW =>DLL40!XXd^F''8HHW5H9	)OW =>DLLd3JJ%%d%7HHW5H9&HHW%'IIKHHW% LL!6@$%87%BCCi ++) [ '& [s%   AL$L?I;LL	
LLc                     t               5  t        |t              s|g}| j                  5  | j                  j                  |g|z          d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY wr   )r    r/   r`   r<   r,   send_multipart)r?   r7   rt   s      r   ri   zServer.send_to_client   sW    [fd+ ""**G9v+=> # [ #" [s"    A( AA(A%	!A((A1c                     t               5  t        j                  d       | j                  |d       d d d        y # 1 sw Y   y xY w)NzServer sends ack   ack)r    r   rI   ri   )r?   r7   rY   s      r   r_   z
Server.ack   s.    [LL+,0 [[s	   (<Ac                 |    | j                   j                  |d       t        j                  dt	        |             y )NFrU   rV   )r+   re   r   rI   rf   )r?   rq   s     r   re   zServer.append   s,    

$U+-s4y9rC   c                 v    t               5  | j                  j                          d d d        y # 1 sw Y   y xY wr   )r    r+   rk   rJ   s    r   rk   zServer.drop   s    [JJOO [[s   /8c                     t               5  t        j                  d|       | j                  5  | j                  j                  |d      }d d d        cd d d        S # 1 sw Y   xY w# 1 sw Y   y xY w)NzServer gets keys: %sFrU   )r    r   rI   r;   r+   rh   )r?   ro   rt   s      r   rh   z
Server.get   sP    [LL/659 	 [ [s"   #A+A	A+A(	$A++A4c                    t         j                  d       d| _        | j                          t	        t
        j                  j                        5  | j                  j                  d       d d d        t	        t
        j                  j                        5  | j                  j                  d       d d d        | j                  j                  j                          y # 1 sw Y   uxY w# 1 sw Y   :xY w)NrS   rO   r      )r   rI   r8   r>   r   r(   errorZMQErrorr,   closer*   destroyr+   r9   releaserJ   s    r   r   zServer.close   s    _%

cii(()KKa  *cii(()LL  # *

!	 *)))s   C C, C),C5c                 &    | j                          | S r   )r=   rJ   s    r   	__enter__zServer.__enter__   s    

rC   c                 V    | j                           | j                  j                  |  y 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"   %   sG    @E@=7Dr?1
:"#rC   r"   c                 f   t        t        t        |       dz  d      | j                         d      }t	        | j                               }t        |t        dt        t        t        t        t        d|                  ||z                    }|d| D cg c]  \  }}|	 }}}|sJ |S c c}}w )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   N)r	   maxrf   itemssumrp   minr   r`   r   r   r
   )	lengthsfractionmaxcounttoptotalcutoffkvrt   s	            r   keys_to_flushr      s     s3w<1$a(}}C  !E3q$z#uQ}=>(*,- .F  L)LDAqaLF)M6M *s   B-c                     t        | t              r#t        j                  t	        t
        |             S t        | t              r| S t        | t              r| j                         S t        |       j                         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      sZ     #u~~c-566#u
#szz|s8??rC   c                 R    t         | v rt        | j                  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                   d    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y)ClientNc                 r   || _         t        j                         | _        | j                  j	                  t        j
                        | _        t        j                  d|       | j                  j                  |       | j                  dg d       t               | _        t        j                  |        y )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__   sz    {{}ll))#**5,g6G$		&"5	1J	4 rC   c                     d| j                   iS )Nr7   )r7   rJ   s    r   __getstate__zClient.__getstate__   s    4<<((rC   c                 V    | j                  |d          t        j                  d       y )Nr7   z%Reconstruct client from pickled state)rB   r   rI   )r?   states     r   __setstate__zClient.__setstate__   s     eI&'<=rC   c                     |r"| j                   j                         }|dgk(  sJ t        j                  d|       | j                   j	                  |g|z          |r| j                   j                         }|S 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  su    ++,,.C6(?"?/9""G9w#67[[//1F  FrC   c                     t         j                  d| j                  |       t        t	        t
        |            }| j                  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  s?    
 	($,,=Ct,-yyDy11rC   c           	         t         j                  d| j                  t        t	        |            dz          t        t        |      }t        t        j                  |j                                     }| j                  d|       y )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  sY    +T\\3s4y>G;STmT*u**4::<89		)W%rC   c           	          t         j                  d| j                  t        t	        |            dz          t        t        t        |            }| j                  d|       y )NzClient deletes %s %sr   rZ   )	r   rI   r7   r0   rf   r`   ra   r   r   r   s      r   _deletezClient._delete  sC    +T\\3s4y>G;STCt,-		)T"rC   c                 >    | j                  dt        |      |g       y )NrW   )r   r   )r?   rr   rs   s      r   _isetzClient._iset$  s    		'M#.67rC   c                 >    | j                  dg        t        d       y )Nr\   g?)r   r   rJ   s    r   rk   zClient.drop'  s    		'2drC   c                 (    | j                  dg        y )NrR   )r   rJ   s    r   close_serverzClient.close_server+  s    		(BrC   c                 ,   t        | d      rVt        t        j                  j                        5  | j                          d d d        | j                  j                          t        t        j                  j                        5  | j                  j                  d       d d d        t        t        j                  j                        5  | j                  j                  d       d d d        y # 1 sw Y   xY w# 1 sw Y   ]xY w# 1 sw Y   y xY w)Nserver_processr   )hasattrr   r(   r~   r   r   r   rL   r,   r   r*   r   rJ   s    r   r   zClient.close.  s    4)*#)),,-!!# .$$&cii(()KKa  *cii(()LL  # *) .- *)))s#   C2C>D
2C;>D
Dc                 D    | j                          | j                          y r   )rk   r   )r?   typers   	tracebacks       r   r   zClient.__exit__8  s    		

rC   c                 $    | j                          y 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      sC    !)>
2&#
8 $rC   r   c                   $    e Zd Zd Zd Zd Zd Zy)r   c                      y r   r   rJ   s    r   r:   zNotALock.acquireA      trC   c                      y 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                      y 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   @  s    rC   r   )g?i )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	$  S# S#l("  KY K\ rC   