I would like to change our event-loop integration with Trio's guest mode. Trio's guest mode also works on asyncio thanks to aioguest. For it to work, we just need to have a function that can schedule a callback in the host event-loop in a thread-safe way.
- in asyncio, that would be
loop.call_soon_threadsafe(callback),
- in tkinter, that would be
tk.after(0, callback).
- Qt supports Trio's guest mode, see here.
- ...
For instance, here is how it looks like when the host event-loop is tkinter's:
from tkinter import Tk
from anyio import sleep
from anyioutils import start_guest_run
def run_sync_soon_threadsafe(fn):
tk.after(0, fn)
def done_callback(outcome):
print("done")
async def foo():
for i in range(10):
await sleep(0.1)
print(i)
tk = Tk()
start_guest_run(foo, run_sync_soon_threadsafe=run_sync_soon_threadsafe, done_callback=done_callback)
tk.mainloop()
Before calling tk.mainloop(), we call start_guest_run() which runs foo as a task in tkinter's event-loop.
Thoughts?
I would like to change our event-loop integration with Trio's guest mode. Trio's guest mode also works on asyncio thanks to aioguest. For it to work, we just need to have a function that can schedule a callback in the host event-loop in a thread-safe way.
loop.call_soon_threadsafe(callback),tk.after(0, callback).For instance, here is how it looks like when the host event-loop is tkinter's:
Before calling
tk.mainloop(), we callstart_guest_run()which runsfooas a task in tkinter's event-loop.Thoughts?