o
    Zhz                     @  s0  U d Z ddlm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ded< G d	d
 d
eZd"ddZd"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.
    )annotationsN)FutureSelectorEventLoop)WeakKeyDictionary)_futurer   
_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   B/var/www/html/lang_env/lib/python3.10/site-packages/zmq/asyncio.pyr      s    r   returnasyncio.AbstractEventLoopc                   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_loopZ
loop_closeZselector_loopr   r   _close_selector_and_loopM   s   z7_get_selector_windows.<locals>._close_selector_and_loop)r   hasattrasyncio
isinstancer   Ztornado.platform.asyncior   ImportErrorRuntimeErrorwarningswarnRuntimeWarningr   )r   r   r   r   r   r   _get_selector_windows   s4   
r$   c                 C  s   | S )zno-op on non-Windowsr   )loopr   r   r   _get_selector_noopZ   s   r&   win32c                   @  s$   e Zd ZeZejZejZ	dd Z
dS )_AsyncIOc                 C  s4   zt  W S  ty   tjdtdd Y t  S w )NuO   No running event loop. zmq.asyncio should be used from within an asyncio loop.   r   )r   Zget_running_loopr    r!   r"   r#   Zget_event_loopselfr   r   r   _default_loopj   s   
z_AsyncIO._default_loopN)r	   r
   r   r   Z_Future	selectorsEVENT_WRITE_WRITE
EVENT_READ_READr,   r   r   r   r   r(   e   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                    r3   r   r   r4   r6   r   r   r8      r9   N)_get_selectorr1   
add_readerr/   Z
add_writer)r+   r%   socketZevtr7   selectorr   r6   r   _watch_raw_socketz   s   

zPoller._watch_raw_socketc                 G  s*   t |}|D ]}|| || qdS )z$Unschedule callback for a raw socketN)r:   remove_readerZremove_writer)r+   r%   Zsocketsr=   r<   r   r   r   _unwatch_raw_sockets   s
   
zPoller._unwatch_raw_socketsN)r	   r
   r   r   r>   r@   r   r   r   r   r2   w   s    r2   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   )Z	_get_loopr:   r+   Zio_loopr   r   r   r:      s   zSocket._get_selectorc                   s      | j fdd dS )z#initialize the ioloop event handlerc                     s     ddS )Nr   )Z_handle_eventsr   r*   r   r   r8      s    z'Socket._init_io_state.<locals>.<lambda>N)r:   r;   _fdrB   r   r*   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)Z_current_loopZ	is_closedrC   r:   r?   )r+   r%   r   r   r   _clear_io_state   s   zSocket._clear_io_stater   )	r	   r
   r   r   r2   Z_poller_classr:   rD   rF   r   r   r   r   rA      s    

rA   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   rA   _socket_classZ	_instancer   r   r   r   rG      s    rG   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__)r+   r=   	__class__r   r   rL      s   zZMQEventLoop.__init__r   )r	   r
   r   r   rL   __classcell__r   r   rM   r   rI      s    rI   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   )rJ   calledr!   r"   DeprecationWarningr   r   r   r   rJ      s   
rJ   Fc                   C  s
   t   dS )z(DEPRECATED: No longer needed in pyzmq 17N)rJ   r   r   r   r   install   s   
rS   )rG   rA   r2   rI   rS   )r   r   )#r   
__future__r   r   r-   sysr!   r   r   weakrefr   ZzmqZ_zmqr   r   __annotations__r#   r   r$   r&   platformr:   r(   Z_AsyncPollerr2   Z_AsyncSocketrA   rH   rG   rI   _looprJ   rQ   rS   __all__r   r   r   r   <module>   s8    

<
	