moonraker: spawn remote methods on the event loop
This allows regsitered methods to be coroutines. Execution is done on the event loop to prevent a coroutine from blocking the incoming command queue. Signed-off-by: Eric Callahan <arksine.code@gmail.com>
This commit is contained in:
parent
a0e23eb22a
commit
6dfab37ef8
|
@ -183,10 +183,10 @@ class Server:
|
||||||
method = cmd.get('method', None)
|
method = cmd.get('method', None)
|
||||||
if method is not None:
|
if method is not None:
|
||||||
# This is a remote method called from klippy
|
# This is a remote method called from klippy
|
||||||
cb = self.remote_methods.get(method, None)
|
if method in self.remote_methods:
|
||||||
if cb is not None:
|
|
||||||
params = cmd.get('params', {})
|
params = cmd.get('params', {})
|
||||||
cb(**params)
|
self.ioloop.spawn_callback(
|
||||||
|
self._execute_method, method, **params)
|
||||||
else:
|
else:
|
||||||
logging.info(f"Unknown method received: {method}")
|
logging.info(f"Unknown method received: {method}")
|
||||||
return
|
return
|
||||||
|
@ -207,6 +207,14 @@ class Server:
|
||||||
result = ServerError(err, 400)
|
result = ServerError(err, 400)
|
||||||
request.notify(result)
|
request.notify(result)
|
||||||
|
|
||||||
|
async def _execute_method(self, method_name, **kwargs):
|
||||||
|
try:
|
||||||
|
ret = self.remote_methods[method_name](**kwargs)
|
||||||
|
if asyncio.iscoroutine(ret):
|
||||||
|
await ret
|
||||||
|
except Exception:
|
||||||
|
logging.exception(f"Error running remote method: {method_name}")
|
||||||
|
|
||||||
def on_connection_closed(self):
|
def on_connection_closed(self):
|
||||||
self.init_list = []
|
self.init_list = []
|
||||||
self.klippy_state = "disconnected"
|
self.klippy_state = "disconnected"
|
||||||
|
|
Loading…
Reference in New Issue