Skip to content

v1.4.0 - Erlang-native asyncio event loop

Choose a tag to compare

@benoitc benoitc released this 18 Feb 03:16
· 312 commits to main since this release

Added

  • Erlang-native asyncio event loop - Custom asyncio event loop backed by Erlang's scheduler

    • ErlangEventLoop class in priv/erlang_loop.py
    • Sub-millisecond latency via Erlang's enif_select (vs 10ms polling)
    • Zero CPU usage when idle - no busy-waiting or polling overhead
    • Full GIL release during waits for better concurrency
    • Native Erlang scheduler integration for I/O events
    • Event loop policy via get_event_loop_policy()
  • TCP support for asyncio event loop

    • create_connection() - TCP client connections
    • create_server() - TCP server with accept loop
    • _ErlangSocketTransport - Non-blocking socket transport with write buffering
    • _ErlangServer - TCP server with serve_forever() support
  • UDP/datagram support for asyncio event loop

    • create_datagram_endpoint() - Create UDP endpoints with full parameter support
    • _ErlangDatagramTransport - Datagram transport implementation
    • Parameters: local_addr, remote_addr, reuse_address, reuse_port, allow_broadcast
    • DatagramProtocol callbacks: datagram_received(), error_received()
    • Support for both connected and unconnected UDP
  • Asyncio event loop documentation

    • New documentation: docs/asyncio.md

Performance

  • Event loop optimizations
    • Fixed run_until_complete callback removal bug
    • Cached ast.literal_eval lookup at module initialization
    • O(1) timer cancellation via handle-to-callback_id reverse map
    • Detach pending queue under mutex, build Erlang terms outside lock
    • O(1) duplicate event detection using hash set
    • Added PERF_BUILD cmake option for aggressive optimizations (-O3, LTO, -march=native)

Full Changelog: https://github.com/benoitc/erlang-python/blob/main/CHANGELOG.md