[Async-sig] new library: sniffio – Sniff out which async library your code is running under

Brett Cannon brett at python.org
Fri Aug 17 12:26:24 EDT 2018


Importation does not equate to execution. I.e. since I could have multiple
event loops running at once that means what's in sys.modules can't tell me
what event loop I'm currently interacting with.

On Fri, 17 Aug 2018 at 09:09 Alex Grönholm <alex.gronholm at nextday.fi> wrote:

> This was my approach:
>
> def _detect_running_asynclib() -> str:
>     if 'trio' in sys.modules:
>         from trio.hazmat import current_trio_token
>         try:
>             current_trio_token()
>         except RuntimeError:
>             pass
>         else:
>             return 'trio'
>
>     if 'curio' in sys.modules:
>         from curio.meta import curio_running
>         if curio_running():
>             return 'curio'
>
>     if 'asyncio' in sys.modules:
>         from .backends.asyncio import get_running_loop
>         if get_running_loop() is not None:
>             return 'asyncio'
>
>     raise LookupError('Cannot find any running async event loop')
>
>
> Is there something wrong with this?
>
> to, 2018-08-16 kello 00:01 -0700, Nathaniel Smith kirjoitti:
>
> Hi all,
>
>
> A number of people are working on packages that support multiple async
>
> backends (e.g., asyncio + trio, or trio + curio, or trio + twisted,
>
> ...). So then the question arises... how can I figure out which async
>
> library my user is actually using?
>
>
> Answer: install sniffio, and then call
>
> sniffio.current_async_library(), and it tells you.
>
>
> Well, right now it only works for trio and asyncio, but if you
>
> maintain an async library and you want to make it easier for packages
>
> to detect you, then it's easy to add support – see the manual. We
>
> considered various clever things, but ultimately decided that the best
>
> approach was to use a ContextVar and make it the coroutine runner's
>
> responsibility to advertise which async flavor it uses. In particular,
>
> this approach works even for hybrid programs that are using multiple
>
> coroutine runners in the same loop, like a Twisted program with
>
> asyncio-flavored and twisted-flavored coroutines in the same thread,
>
> or a Trio program using trio-asyncio to run both asyncio-flavored and
>
> trio-flavored coroutines in the same thread.
>
>
> Github: https://github.com/python-trio/sniffio
>
> Manual: https://sniffio.readthedocs.io/
>
> PyPI: https://pypi.org/p/sniffio
>
>
> -n
>
>
>
> _______________________________________________
> Async-sig mailing list
> Async-sig at python.org
> https://mail.python.org/mailman/listinfo/async-sig
> Code of Conduct: https://www.python.org/psf/codeofconduct/
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/async-sig/attachments/20180817/28a196d5/attachment.html>


More information about the Async-sig mailing list