o
    i                     @   s0  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 deZd	ejfd
dZd	ejfddZejdkrReZneZG dd dZG dd deejZG dd deejZee_G dd de
je ZG dd deZdZdd Zde_dd Z g dZ!dS )z8AsyncIO support for zmq

Requires asyncio and Python 3.
    N)FutureSelectorEventLoop)WeakKeyDictionary)_future
_selectorsc                   @   s   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__ r   r   F/var/www/edux/Edux_v2/venv/lib/python3.10/site-packages/zmq/asyncio.pyr      s    r   returnc                    s    t v rt   S ttdrGt tjrGzddlm} W n ty&   tdw t	j
dtdd |  t  <  j fd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                      s    _ t d     d S N)closer   popr   asyncio_loop
loop_closeselector_loopr   r   _close_selector_and_loopI   s   z7_get_selector_windows.<locals>._close_selector_and_loop)r   hasattrasyncio
isinstancer   tornado.platform.asyncior   ImportErrorRuntimeErrorwarningswarnRuntimeWarningr   )r   r   r   r   r   r   _get_selector_windows   s.   
r%   c                 C   s   | S )zno-op on non-Windowsr   )loopr   r   r   _get_selector_noopV   s   r'   win32c                   @   s$   e Zd ZeZejZejZ	dd Z
dS )_AsyncIOc                 C   sF   t jdkrzt W S  ty   tjdtdd Y t S w t 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selfr   r   r   _default_loopf   s   

z_AsyncIO._default_loopN)r   r	   r
   r   _Future	selectorsEVENT_WRITE_WRITE
EVENT_READ_READr3   r   r   r   r   r)   a   s
    r)   c                   @   s    e Zd ZdZdd Zdd ZdS )Pollerz1Poller returning asyncio.Future for poll results.c                    sL   t |}|| j@ r|| fdd || j@ r$|| fdd dS dS )z"Schedule callback for a raw socketc                          S r   r   argsfr   r   <lambda>{       z*Poller._watch_raw_socket.<locals>.<lambda>c                     r;   r   r   r<   r>   r   r   r@   }   rA   N)_get_selectorr9   
add_readerr7   
add_writer)r2   r&   socketevtr?   selectorr   r>   r   _watch_raw_socketw   s   

zPoller._watch_raw_socketc                 G   s*   t |}|D ]}|| || qdS )z$Unschedule callback for a raw socketN)rB   remove_readerremove_writer)r2   r&   socketsrG   rE   r   r   r   _unwatch_raw_sockets   s
   
zPoller._unwatch_raw_socketsN)r   r	   r
   r   rH   rL   r   r   r   r   r:   t   s    r:   c                   @   s0   e Zd ZdZeZd	ddZd	ddZdd ZdS )
Socketz<Socket returning asyncio Futures for send/recv/poll methods.Nc                 C   s   |d u r|   }t|S r   )	_get_looprB   r2   io_loopr   r   r   rB      s   zSocket._get_selectorc                    s      | j fdd dS )z#initialize the ioloop event handlerc                      s     ddS )Nr   )_handle_eventsr   r1   r   r   r@      s    z'Socket._init_io_state.<locals>.<lambda>N)rB   rC   _fdrO   r   r1   r   _init_io_state   s   
zSocket._init_io_statec                 C   s>   | j }|r| s| jdkr| || j dS dS dS dS )zEclear any ioloop event handler

        called once at close
        N)_current_loop	is_closedrR   rB   rI   )r2   r&   r   r   r   _clear_io_state   s   zSocket._clear_io_stater   )	r   r	   r
   r   r:   _poller_classrB   rS   rW   r   r   r   r   rM      s    

rM   c                   @   s   e Zd ZdZeZdZdS )Contextz/Context for creating asyncio-compatible SocketsN)r   r	   r
   r   rM   _socket_class	_instancer   r   r   r   rY      s    rY   c                       s"   e Zd ZdZd fdd	Z  ZS )ZMQEventLoopz}DEPRECATED: AsyncIO eventloop using zmq_poll.

    pyzmq sockets should work with any asyncio event loop as of pyzmq 17.
    Nc                    s   t   t |S r   )_deprecatedsuper__init__)r2   rG   	__class__r   r   r_      s   zZMQEventLoop.__init__r   )r   r	   r
   r   r_   __classcell__r   r   r`   r   r\      s    r\   c                   C   s$   t jrd S dt _tjdtdd d S )NTzsZMQEventLoop and zmq.asyncio.install are deprecated in pyzmq 17. Special eventloop integration is no longer needed.r*   r   )r]   calledr"   r#   DeprecationWarningr   r   r   r   r]      s   
r]   Fc                   C   s
   t   dS )z(DEPRECATED: No longer needed in pyzmq 17N)r]   r   r   r   r   install   s   
re   )rY   rM   r:   r\   re   )"r   r   r5   r-   r"   r   r   weakrefr   zmq_zmqr   r   __annotations__r$   r   AbstractEventLoopr%   r'   platformrB   r)   _AsyncPollerr:   _AsyncSocketrM   rZ   rY   r\   _loopr]   rc   re   __all__r   r   r   r   <module>   s:    
9
	