tractor/nooz/121.feature.rst

1.4 KiB

Add "infected asyncio mode; a sub-system to spawn and control asyncio actors using trio's guest-mode.

This gets us the following very interesting functionality:

  • ability to spawn an actor that has a process entry point of asyncio.run() by passing infect_asyncio=True to Portal.start_actor() (and friends).
  • the asyncio actor embeds trio using guest-mode and starts a main trio task which runs the tractor.Actor._async_main() entry point engages all the normal tractor runtime IPC/messaging machinery; for all purposes the actor is now running normally on a trio.run().
  • the actor can now make one-to-one task spawning requests to the underlying asyncio event loop using either of:
    • to_asyncio.run_task() to spawn and run an asyncio task to completion and block until a return value is delivered.
    • async with to_asyncio.open_channel_from(): which spawns a task and hands it a pair of "memory channels" to allow for bi-directional streaming between the now SC-linked trio and asyncio tasks.

The output from any call(s) to asyncio can be handled as normal in trio/tractor task operation with the caveat of the overhead due to guest-mode use.

For more details see the original PR and issue.