From 8070b16bd0c694592a55ce96ea29d81d0aec080b Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Mon, 27 Jul 2020 11:03:17 -0400 Subject: [PATCH] Support asyncio actors with the trio spawner backend --- tractor/_child.py | 8 ++++++-- tractor/_entry.py | 10 +++++++++- tractor/_spawn.py | 5 ++++- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/tractor/_child.py b/tractor/_child.py index f384ac4..7790731 100644 --- a/tractor/_child.py +++ b/tractor/_child.py @@ -37,12 +37,15 @@ def parse_ipaddr(arg): return (str(host), int(port)) +from ._entry import _trio_main + if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("--uid", type=parse_uid) parser.add_argument("--loglevel", type=str) parser.add_argument("--parent_addr", type=parse_ipaddr) + parser.add_argument("--asyncio", action='store_true') args = parser.parse_args() subactor = Actor( @@ -54,5 +57,6 @@ if __name__ == "__main__": _trio_main( subactor, - parent_addr=args.parent_addr - ) \ No newline at end of file + parent_addr=args.parent_addr, + infect_asyncio=args.asyncio, + ) diff --git a/tractor/_entry.py b/tractor/_entry.py index 812f3ab..0e31f32 100644 --- a/tractor/_entry.py +++ b/tractor/_entry.py @@ -38,6 +38,7 @@ def _mp_main( forkserver_info: Tuple[Any, Any, Any, Any, Any], start_method: str, parent_addr: Tuple[str, int] = None, + infect_asyncio: bool = False, ) -> None: """The routine called *after fork* which invokes a fresh ``trio.run`` """ @@ -79,6 +80,7 @@ def _trio_main( actor: 'Actor', # type: ignore *, parent_addr: Tuple[str, int] = None, + infect_asyncio: bool = False, ) -> None: """Entry point for a `trio_run_in_process` subactor. """ @@ -88,6 +90,8 @@ def _trio_main( log.info(f"Started new trio process for {actor.uid}") + log.info(f"Started new trio process for {actor.uid}") + if actor.loglevel is not None: log.info( f"Setting loglevel for {actor.uid} to {actor.loglevel}") @@ -105,7 +109,11 @@ def _trio_main( ) try: - trio.run(trio_main) + if infect_asyncio: + actor._infected_aio = True + run_as_asyncio_guest(trio_main) + else: + trio.run(trio_main) except KeyboardInterrupt: log.warning(f"Actor {actor.uid} received KBI") diff --git a/tractor/_spawn.py b/tractor/_spawn.py index d16ddbd..5525c5d 100644 --- a/tractor/_spawn.py +++ b/tractor/_spawn.py @@ -244,6 +244,7 @@ async def new_proc( _runtime_vars: Dict[str, Any], # serialized and sent to _child *, + infect_asyncio: bool = False, task_status: TaskStatus[Portal] = trio.TASK_STATUS_IGNORED ) -> None: @@ -260,7 +261,6 @@ async def new_proc( uid = subactor.uid if _spawn_method == 'trio': - spawn_cmd = [ sys.executable, "-m", @@ -283,6 +283,9 @@ async def new_proc( "--loglevel", subactor.loglevel ] + # Tell child to run in guest mode on top of ``asyncio`` loop + if infect_asyncio: + spawn_cmd.append("--asyncio") cancelled_during_spawn: bool = False proc: Optional[trio.Process] = None