Skip to content

Commit be09efa

Browse files
committed
feat: lazily initialize pause queue in WokwiClient and ensure thread-safe event handling in EventQueue
1 parent 0f7246c commit be09efa

File tree

2 files changed

+8
-2
lines changed

2 files changed

+8
-2
lines changed

src/wokwi_client/client.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ def __init__(self, token: str, server: Optional[str] = None):
4242
self._transport = Transport(token, server or DEFAULT_WS_URL)
4343
self.last_pause_nanos = 0
4444
self._transport.add_event_listener("sim:pause", self._on_pause)
45-
self._pause_queue = EventQueue(self._transport, "sim:pause")
45+
# Lazily create the pause queue inside the running event loop
46+
self._pause_queue: Optional[EventQueue] = None
4647

4748
async def connect(self) -> dict[str, Any]:
4849
"""
@@ -159,6 +160,8 @@ async def wait_until_simulation_time(self, seconds: float) -> None:
159160
await pause(self._transport)
160161
remaining_nanos = seconds * 1e9 - self.last_pause_nanos
161162
if remaining_nanos > 0:
163+
if self._pause_queue is None:
164+
self._pause_queue = EventQueue(self._transport, "sim:pause")
162165
self._pause_queue.flush()
163166
await resume(self._transport, int(remaining_nanos))
164167
await self._pause_queue.get()

src/wokwi_client/event_queue.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,15 @@ class EventQueue:
2323
"""A queue for events from a specific event type."""
2424

2525
def __init__(self, transport: Transport, event_type: str) -> None:
26+
# Bind the queue to the current running loop
27+
self._loop = asyncio.get_running_loop()
2628
self._queue: asyncio.Queue[EventMessage] = asyncio.Queue()
2729
self._transport = transport
2830
self._event_type = event_type
2931

3032
def listener(event: EventMessage) -> None:
31-
self._queue.put_nowait(event)
33+
# Ensure put happens on the queue's loop (safe across threads/loops)
34+
self._loop.call_soon_threadsafe(self._queue.put_nowait, event)
3235

3336
self._listener = listener
3437
self._transport.add_event_listener(self._event_type, self._listener)

0 commit comments

Comments
 (0)