U
    @f                     @   s^   d Z ddlZddlmZ ddlmZmZ ddlmZ ddl	m
Z
 ddlmZ d	gZd
d	 ZdS )z"
Asyncio compatibility functions.
    N)GreenletExit   )spawn
getcurrent)Event)get_hub)Hubspawn_for_awaitablec                    s(   t t tstd fdd}t|S )a  
    Take a coroutine or some other object that can be awaited
    (``asyncio.Future``, ``asyncio.Task``), and turn it into a ``GreenThread``.

    Known limitations:

    * The coroutine/future/etc.  don't run in their own
      greenlet/``GreenThread``.
    * As a result, things like ``eventlet.Lock``
      won't work correctly inside ``async`` functions, thread ids aren't
      meaningful, and so on.
    zmThis API only works with eventlet's asyncio hub. To use it, set an EVENTLET_HUB=asyncio environment variable.c                     sR   t jt  d  fdd} t |  t  fdd     S )N)loopc                    s.   z|    W n tk
r(      Y nX d S )N)waitr   cancel)Zgthread)future J/var/www/html/chatgpt/venv/lib/python3.8/site-packages/eventlet/asyncio.py_got_result(   s    z6spawn_for_awaitable.<locals>._run.<locals>._got_resultc                    s
     dS )NT)send)_)
has_resultr   r   <lambda>2       z3spawn_for_awaitable.<locals>._run.<locals>.<lambda>)	asyncioensure_futureget_running_loopr   linkr   add_done_callbackr   result)r   	coroutine)r   r   r   _run#   s    z!spawn_for_awaitable.<locals>._run)
isinstancer   
AsyncioHubRuntimeErrorr   )r   r   r   r   r   r	      s    )__doc__r   Zgreenletr   Zgreenthreadr   r   eventr   Zhubsr   Zhubs.asyncior   r    __all__r	   r   r   r   r   <module>   s   