Skip to content

Make an async.get_running_loop() and asyncio.current_task() that returns None #103664

Closed as not planned
@collinanderson

Description

@collinanderson

Hi All,

Feature or enhancement

Make an async.get_running_loop() that returns None instead of raising RuntimeError. Or make asyncio._get_running_loop() public. Also make a asyncio.current_task() that returns None.

Pitch

Some frameworks, like Django use asyncio.get_running_loop() to detect whether or not the application has a running event loop, and fall back to using threads if not in async mode. This happen a lot across the codebase. The problem is in sync mode asyncio.get_running_loop() always raises RuntimeError, which is very inefficient. It would be much more efficient to get a None value returned. It ends up raising a RuntimeError whenever thread/task-local storage is used in non-async mode.

Example: https://github.com/django/asgiref/blob/main/asgiref/sync.py#L501-L510

https://github.com/django/asgiref/blob/main/asgiref/local.py#L44-L57

asyncio.run uses asyncio._get_running_loop(). Can other programs use it too?

asyncio.run() uses asyncio._get_running_loop() under the hood. https://github.com/python/cpython/blob/main/Lib/asyncio/runners.py#L188

Can asyncio._get_running_loop() be made public so other software can also the more efficient version? Can we get a version of asyncio.current_task() that returns None instead of raising a RuntimeError?

Thanks,
Collin

Metadata

Metadata

Assignees

No one assigned

    Labels

    pendingThe issue will be closed if no feedback is providedtopic-asynciotype-featureA feature request or enhancement

    Projects

    Status

    Done

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions