rclpy
rclpy copied to clipboard
Feature: asyncio executor
Motivation
Current wait_set based executors are highly inefficient and don’t integrate cleanly with Python’s asyncio ecosystem.
Examples of inefficiencies in the wait_set executor:
- Reoccurring construction of the wait set
- Revisiting blocked tasks every iteration
- Busy looping while a callback group is blocking
Advantages of integrating with asyncio:
- Better support for asynchronous code – take advantage of many existing features like
call_later(),sleep(), and task exception handling - Easy integration with large Python libraries –
FastAPI,pyserial-asyncio,pytransitions,aiohttp,python-can, etc. - High performance –
asynciois already far more optimized than the existing wait_set executor, and libraries like uvloop are available for even higher performance, matching the current cpp implementation of the EventsExecutor - Reduction in code duplication - lower maintenance costs and library complexity by transitioning to a built in event loop implementation
Proposed Implementation
-
Shared dispatch logic Re-use the existing Python executor’s “take_entity” functions to pull items from the queue.
-
Timers via asyncio
Replace the DelayedEventsThread withloop.call_at(). -
AbstractExecutor base class
Define anAbstractExecutor(similar toasyncio.AbstractEventLoop) to unify typing acrossExecutor,EventsExecutor, andAsyncioExecutor.
Related Issues & PRs
- #1234 – async wait/sleep implementation
- #1098 – Tasks that raise an exception crash the entire executor
- #962 – Runtime error when a long async callback is triggered
- #1395 – Ignore exceptions raised in user-created tasks
- #971 – Enable limited use of asyncio with executors