Feature request
Add guest mode to asyncio, enabling it to run cooperatively inside a host event loop such as Tkinter, Qt, GTK, or any other framework that owns the main thread.
Motivation
GUI toolkits (Tk, Qt, GTK, pygame, ...) each have their own event loop that must run on the main thread. Today there is no standard way to use asyncio coroutines inside a GUI application without:
- Polling hacks (periodic
root.after() calls)
- Replacing the event loop entirely (fragile, framework-specific)
- Running asyncio in a separate thread and manually marshalling results
Trio solved this problem with trio.lowlevel.start_guest_run() and the approach has proven robust across many GUI frameworks (see trio-guest).
Proposed API
import asyncio
task = asyncio.start_guest_run(
async_fn, *args,
run_sync_soon_threadsafe=host.schedule_callback,
done_callback=host.on_done,
)
The implementation decomposes BaseEventLoop._run_once() into three new public methods — poll_events(), process_events(), and process_ready() — then uses a dual-thread architecture where the host thread processes callbacks and a daemon I/O thread polls for events.
Prior art and discussion
A reference implementation with tests (12 tests passing, full asyncio test suite regression-free) is ready to submit as a PR.
Linked PRs
Feature request
Add guest mode to asyncio, enabling it to run cooperatively inside a host event loop such as Tkinter, Qt, GTK, or any other framework that owns the main thread.
Motivation
GUI toolkits (Tk, Qt, GTK, pygame, ...) each have their own event loop that must run on the main thread. Today there is no standard way to use
asynciocoroutines inside a GUI application without:root.after()calls)Trio solved this problem with
trio.lowlevel.start_guest_run()and the approach has proven robust across many GUI frameworks (see trio-guest).Proposed API
The implementation decomposes
BaseEventLoop._run_once()into three new public methods —poll_events(),process_events(), andprocess_ready()— then uses a dual-thread architecture where the host thread processes callbacks and a daemon I/O thread polls for events.Prior art and discussion
A reference implementation with tests (12 tests passing, full asyncio test suite regression-free) is ready to submit as a PR.
Linked PRs