rclpy icon indicating copy to clipboard operation
rclpy copied to clipboard

Feature: asyncio executor

Open nadavelkabets opened this issue 7 months ago • 2 comments

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 – asyncio is 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 with loop.call_at().

  • AbstractExecutor base class
    Define an AbstractExecutor (similar to asyncio.AbstractEventLoop) to unify typing across Executor, EventsExecutor, and AsyncioExecutor.

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

nadavelkabets avatar May 16 '25 14:05 nadavelkabets