Closed
Description
Hello, so I was building a simple GCS. A simple UI on the front and a python server at the back.
Using websocket to handle commands and Server-Sent Events (SSE) for unidirectional information (telemetry). Whilst building out the telemetry aspect, I noticed that RuntimeError randomly got thrown.
Exception ignored in: <function WrappedIterator.__del__ at 0x00000202DCC768E0>
Traceback (most recent call last):
File "C:\Users\user\app\.venv\Lib\site-packages\aiogrpc\utils.py", line 168, in __del__
self._stream_executor.shutdown()
File "C:\Python312\Lib\concurrent\futures\thread.py", line 238, in shutdown
t.join()
File "C:\Python312\Lib\threading.py", line 1144, in join
raise RuntimeError("cannot join current thread")
RuntimeError: cannot join current thread
Depending on how I structured the SSE route, it got thrown frequently or once in a while. A basic structure:
# sse route
async def event_generator():
while True:
if await request.is_disconnected():
print("Gracefully stopping stream...")
break
# uncommenting these lines instead gets the error thrown more frequently
#
# battery = ensure_future(get_battery())
# gps = ensure_future(get_gps())
# position = ensure_future(get_position())
# heading = ensure_future(get_heading())
# flight_mode = ensure_future(get_flight_mode())
# fw_metrics = ensure_future(get_fw_metrics())
# # is_in_air = ensure_future(get_is_in_air())
# # landed_state = ensure_future(get_landed_state())
# # mission_progress = ensure_future(get_mission_progress())
# home = ensure_future(get_home())
# health = ensure_future(get_health())
# # status = ensure_future(get_status_text())
# rc_status = ensure_future(get_rc_status())
battery = await get_battery()
gps = await get_gps()
position = await get_position()
heading = await get_heading()
flight_mode = await get_flight_mode()
fw_metrics = await get_fw_metrics()
# is_in_air = ensure_future(get_is_in_air())
# landed_state = ensure_future(get_landed_state())
# mission_progress = ensure_future(get_mission_progress())
home = await get_home()
health = await get_health()
# status = ensure_future(get_status_text())
rc_status = await get_rc_status()
yield encode({
"event": "telemetry",
"data": {
"battery": battery,
"gps": gps,
"position": position,
"heading": heading,
"flight_mode": flight_mode,
"fw_metrics": fw_metrics,
# "is_in_air": await is_in_air,
# "landed_state": await landed_state,
# "mission_progress": await mission_progress,
"home": home,
"health": health,
# "info": info,
# "status": await status,
"rc_status": rc_status,
}
}).decode("utf-8")
await sleep(.5)
res = EventSourceResponse(
content=event_generator(),
status_code=200,
media_type="text/event-stream",
headers={
"Content-Type": "text/event-stream",
"Cache-Control": "no-cache",
"Connection": "keep-alive",
"X-Accel-Buffering": "no",
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Credentials": "true",
}
)
return res
The error comes from mavsdk dependency: aiogrpc
. I am not well-versed with multi-threading in python but I assume the issue stems from aiogrpc creating its own threads and attempting to join them. Is there any way I can disable that? Possibly use asyncio
fully for running tasks on a separate thread? Or maybe find a fix I am overlooking. Thanks
Metadata
Metadata
Assignees
Labels
No labels