
    Zd                        U d Z ddlZddlZddlZddlZddlmZmZ ddlmZ ddl	Z
ddl	mZ  e            Zeed<    G d de          Zd	ej        fd
Zd	ej        fdZej        dk    reZneZ G d d          Z G d deej                  Z G d deej                  Zee_         G d de
j        e                   Z G d de          ZdZd Zde_        d Z g dZ!dS )z8AsyncIO support for zmq

Requires asyncio and Python 3.
    N)FutureSelectorEventLoop)WeakKeyDictionary)_future
_selectorsc                       e Zd ZdZdS )ProactorSelectorThreadWarningzWarning class for notifying about the extra thread spawned by tornado

    We automatically support proactor via tornado's AddThreadSelectorEventLoopN)__name__
__module____qualname____doc__     +lib/python3.11/site-packages/zmq/asyncio.pyr	   r	      s"        R R R Rr   r	   returnc                 p     t           v rt                     S t          t          d          rt           t          j                  rm	 ddlm} n# t          $ r t          d          w xY wt          j
        dt          d            |           xt            <    j         fd}| _        S  S )	zGet selector-compatible loop

    Returns an object with ``add_reader`` family of methods,
    either the loop itself or a SelectorThread instance.

    Workaround Windows proactor removal of
    *reader methods, which we need for zmq sockets.
    ProactorEventLoopr   )AddThreadSelectorEventLoopa  Proactor event loop does not implement add_reader family of methods required for zmq. zmq will work with proactor if tornado >= 6.1 can be found. Use `asyncio.set_event_loop_policy(WindowsSelectorEventLoopPolicy())` or install 'tornado>=6.1' to avoid this error.a   Proactor event loop does not implement add_reader family of methods required for zmq. Registering an additional selector thread for add_reader support via tornado. Use `asyncio.set_event_loop_policy(WindowsSelectorEventLoopPolicy())` to avoid this warning.   
stacklevelc                  t     _         t                               d                                              d S N)closer   pop)asyncio_loop
loop_closeselector_loops   r   _close_selector_and_loopz7_get_selector_windows.<locals>._close_selector_and_loopI   s9     ",LNN<...!!!!!r   )r   hasattrasyncio
isinstancer   tornado.platform.asyncior   ImportErrorRuntimeErrorwarningswarnRuntimeWarningr   )r   r   r   r   r   s   `  @@r   _get_selector_windowsr)      s     z!!,'' w+,, &g/2 2 &	KKKKKKK 	 	 	B  	 	& 	
 	
 	
 	
 4N3Ml3[3[[
<0 "'
	" 	" 	" 	" 	" 	" 	" 6s   
A A+c                     | S )zno-op on non-Windowsr   )loops    r   _get_selector_noopr,   V   s    Kr   win32c                   4    e Zd ZeZej        Zej        Z	d Z
dS )_AsyncIOc                     t           j        dk    r@	 t          j                    S # t          $ r t          j        dt          d           Y nw xY wt          j                    S )N)      uO   No running event loop. zmq.asyncio should be used from within an asyncio loop.   r   )	sysversion_infor!   get_running_loopr%   r&   r'   r(   get_event_loopselfs    r   _default_loopz_AsyncIO._default_loopf   s|    v%%/111   e"       %'''s   % &AAN)r
   r   r   r   _Future	selectorsEVENT_WRITE_WRITE
EVENT_READ_READr:   r   r   r   r/   r/   a   s8        G"F E( ( ( ( (r   r/   c                       e Zd ZdZd Zd ZdS )Pollerz1Poller returning asyncio.Future for poll results.c                     t          |          }|| j        z  r|                    |fd           || j        z  r|                    |fd           dS dS )z"Schedule callback for a raw socketc                                   S r   r   argsfs    r   <lambda>z*Poller._watch_raw_socket.<locals>.<lambda>{       aacc r   c                                   S r   r   rE   s    r   rH   z*Poller._watch_raw_socket.<locals>.<lambda>}   rI   r   N)_get_selectorr@   
add_readerr>   
add_writer)r9   r+   socketevtrG   selectors       ` r   _watch_raw_socketzPoller._watch_raw_socketw   s~     && 	;(9(9(9(9::: 	;(9(9(9(9:::::	; 	;r   c                     t          |          }|D ],}|                    |           |                    |           -dS )z$Unschedule callback for a raw socketN)rK   remove_readerremove_writer)r9   r+   socketsrP   rN   s        r   _unwatch_raw_socketszPoller._unwatch_raw_sockets   sS     && 	+ 	+F""6***""6****	+ 	+r   N)r
   r   r   r   rQ   rV   r   r   r   rB   rB   t   s8        ;;; ; ;+ + + + +r   rB   c                   ,    e Zd ZdZeZddZddZd ZdS )Socketz<Socket returning asyncio Futures for send/recv/poll methods.Nc                 L    ||                                  }t          |          S r   )	_get_looprK   r9   io_loops     r   rK   zSocket._get_selector   s$    ?nn&&GW%%%r   c                 j                           |                               j         fd           dS )z#initialize the ioloop event handlerc                  0                          dd          S )Nr   )_handle_eventsr8   s   r   rH   z'Socket._init_io_state.<locals>.<lambda>   s    d11!Q77 r   N)rK   rL   _fdr[   s   ` r   _init_io_statezSocket._init_io_state   sD    7##..H7777	
 	
 	
 	
 	
r   c                     | j         }|rN|                                s<| j        dk    r3|                     |                              | j                   dS dS dS dS )zEclear any ioloop event handler

        called once at close
        N)_current_loop	is_closedr`   rK   rS   )r9   r+   s     r   _clear_io_statezSocket._clear_io_state   sq    
 ! 	=(( 	=TX^^t$$2248<<<<<	= 	= 	= 	=^^r   r   )	r
   r   r   r   rB   _poller_classrK   ra   rf   r   r   r   rX   rX      sV        FFM& & & &

 
 
 
= = = = =r   rX   c                       e Zd ZdZeZdZdS )Contextz/Context for creating asyncio-compatible SocketsN)r
   r   r   r   rX   _socket_class	_instancer   r   r   ri   ri      s         99M IIIr   ri   c                   $     e Zd ZdZd fd	Z xZS )ZMQEventLoopz}DEPRECATED: AsyncIO eventloop using zmq_poll.

    pyzmq sockets should work with any asyncio event loop as of pyzmq 17.
    Nc                 b    t                       t                                          |          S r   )_deprecatedsuper__init__)r9   rP   	__class__s     r   rq   zZMQEventLoop.__init__   s$    ww)))r   r   )r
   r   r   r   rq   __classcell__)rr   s   @r   rm   rm      sG         
* * * * * * * * * *r   rm   c                  r    t           j        rd S dt           _        t          j        dt          d           d S )NTzsZMQEventLoop and zmq.asyncio.install are deprecated in pyzmq 17. Special eventloop integration is no longer needed.r1   r   )ro   calledr&   r'   DeprecationWarningr   r   r   ro   ro      sF     KM}     r   Fc                  "    t                       dS )z(DEPRECATED: No longer needed in pyzmq 17N)ro   r   r   r   installrx      s    MMMMMr   )ri   rX   rB   rm   rx   )"r   r!   r<   r4   r&   r   r   weakrefr   zmq_zmqr   r   __annotations__r(   r	   AbstractEventLoopr)   r,   platformrK   r/   _AsyncPollerrB   _AsyncSocketrX   rj   ri   rm   _loopro   ru   rx   __all__r   r   r   <module>r      s\          



  - - - - - - - - % % % % % %           !2 1 3 3
 3 3 3R R R R RN R R R66 6 6 6r 9    
 <7)MM&M( ( ( ( ( ( ( (&+ + + + +Xw+ + + +&= = = = =Xw+ = = =4      dl6"   * * * * *$ * * * 		 	 	    
  r   