Skip to content

Commit

Permalink
utils/asyn: Factor out the calls to asyncio.run
Browse files Browse the repository at this point in the history
Prepare for providing our own implementation of asyncio.run() to work
without nest_asyncio package.
  • Loading branch information
douglas-raillard-arm authored and marcbonnici committed Sep 12, 2024
1 parent 165b87f commit b2e19d3
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 7 deletions.
5 changes: 2 additions & 3 deletions devlib/module/cgroups.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,12 @@
from shlex import quote
import itertools
import warnings
import asyncio

from devlib.module import Module
from devlib.exception import TargetStableError
from devlib.utils.misc import list_to_ranges, isiterable
from devlib.utils.types import boolean
from devlib.utils.asyn import asyncf
from devlib.utils.asyn import asyncf, run


class Controller(object):
Expand Down Expand Up @@ -410,7 +409,7 @@ async def register_controller(ss):
controller.mount_point)
self.controllers[ss.name] = controller

asyncio.run(
run(
target.async_manager.map_concurrently(
register_controller,
subsys,
Expand Down
16 changes: 12 additions & 4 deletions devlib/utils/asyn.py
Original file line number Diff line number Diff line change
Expand Up @@ -292,6 +292,14 @@ def __set_name__(self, owner, name):
self._name = name


def run(coro):
"""
Similar to :func:`asyncio.run` but can be called while an event loop is
running.
"""
return asyncio.run(coro)


def asyncf(f):
"""
Decorator used to turn a coroutine into a blocking function, with an
Expand Down Expand Up @@ -328,14 +336,14 @@ def genf():
asyncgen = x.__aiter__()
while True:
try:
yield asyncio.run(asyncgen.__anext__())
yield run(asyncgen.__anext__())
except StopAsyncIteration:
return

return genf()
else:
return await x
return asyncio.run(wrapper())
return run(wrapper())

return _AsyncPolymorphicFunction(
asyn=f,
Expand All @@ -358,10 +366,10 @@ def __aexit__(self, *args, **kwargs):
return self.cm.__aexit__(*args, **kwargs)

def __enter__(self, *args, **kwargs):
return asyncio.run(self.cm.__aenter__(*args, **kwargs))
return run(self.cm.__aenter__(*args, **kwargs))

def __exit__(self, *args, **kwargs):
return asyncio.run(self.cm.__aexit__(*args, **kwargs))
return run(self.cm.__aexit__(*args, **kwargs))


def asynccontextmanager(f):
Expand Down

0 comments on commit b2e19d3

Please sign in to comment.