fix issues with calling async function from different threads that may or may not have an event loop
This commit is contained in:
@@ -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),
|
||||
})))
|
||||
|
||||
25
src/backend/async_utils.py
Normal file
25
src/backend/async_utils.py
Normal 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)
|
||||
Reference in New Issue
Block a user