fix issues with calling async function from different threads that may or may not have an event loop

This commit is contained in:
liamcottle
2025-01-20 13:20:03 +13:00
parent b5f9403c52
commit 6f325d24e7
2 changed files with 27 additions and 1 deletions

View File

@@ -23,6 +23,7 @@ from serial.tools import list_ports
import database
from src.backend.announce_handler import AnnounceHandler
from src.backend.async_utils import AsyncUtils
from src.backend.colour_utils import ColourUtils
from src.backend.interface_config_parser import InterfaceConfigParser
from src.backend.lxmf_message_fields import LxmfImageField, LxmfFileAttachmentsField, LxmfFileAttachment, LxmfAudioField
@@ -2408,7 +2409,7 @@ class ReticulumMeshChat:
self.db_upsert_lxmf_message(lxmf_message)
# send lxmf message state to all websocket clients
asyncio.run(self.websocket_broadcast(json.dumps({
AsyncUtils.run_async(self.websocket_broadcast(json.dumps({
"type": "lxmf_message_state_updated",
"lxmf_message": self.convert_lxmf_message_to_dict(lxmf_message),
})))

View File

@@ -0,0 +1,25 @@
import asyncio
class AsyncUtils:
# this method allows running the provided async coroutine from within a sync function
# it will run the async function on the existing event loop if available, otherwise it will start a new event loop
@staticmethod
def run_async(coroutine):
# attempt to get existing event loop
existing_event_loop = None
try:
existing_event_loop = asyncio.get_running_loop()
except RuntimeError:
# 'RuntimeError: no running event loop'
pass
# if there is an existing event loop running, submit the coroutine to that loop
if existing_event_loop and existing_event_loop.is_running():
existing_event_loop.create_task(coroutine)
return
# otherwise start a new event loop to run the coroutine
asyncio.run(coroutine)