Executors; repair relay.service

This commit is contained in:
Tony Garnock-Jones 2023-03-06 23:24:36 +01:00
parent f00d75b74b
commit bd71008e13
3 changed files with 23 additions and 8 deletions

View File

@ -45,7 +45,7 @@ def main():
@turn.linked_task() @turn.linked_task()
async def accept_input(f): async def accept_input(f):
reader = asyncio.StreamReader() reader = asyncio.StreamReader()
await actor.find_loop().connect_read_pipe(lambda: asyncio.StreamReaderProtocol(reader), sys.stdin) await f.loop.connect_read_pipe(lambda: asyncio.StreamReaderProtocol(reader), sys.stdin)
while line := (await reader.readline()).decode('utf-8'): while line := (await reader.readline()).decode('utf-8'):
turn.external(f, lambda: turn.send(ds, Says(me, line.strip()))) turn.external(f, lambda: turn.send(ds, Says(me, line.strip())))
turn.external(f, lambda: turn.stop(root_facet)) turn.external(f, lambda: turn.stop(root_facet))

View File

@ -36,7 +36,10 @@ class System:
if debug: if debug:
self.loop.set_debug(True) self.loop.set_debug(True)
self.queue_task(lambda: Actor(boot_proc, system = self, name = name)) self.queue_task(lambda: Actor(boot_proc, system = self, name = name))
self.loop.run_forever() try:
self.loop.run_forever()
except:
traceback.print_exc()
while asyncio.all_tasks(self.loop): while asyncio.all_tasks(self.loop):
self.loop.stop() self.loop.stop()
self.loop.run_forever() self.loop.run_forever()
@ -224,8 +227,21 @@ class Facet:
self.inert_check_preventers = self.inert_check_preventers - 1 self.inert_check_preventers = self.inert_check_preventers - 1
return disarm return disarm
def linked_task(self, coro_fn, loop = None): @property
def loop(self):
return self.actor._system.loop
def linked_task(self, coro_fn, run_in_executor=False):
task = None task = None
if run_in_executor:
inner_coro_fn = coro_fn
async def outer_coro_fn(facet):
try:
await self.loop.run_in_executor(None, lambda: inner_coro_fn(facet))
except:
import traceback
traceback.print_exc()
coro_fn = outer_coro_fn
@self.on_stop_or_crash @self.on_stop_or_crash
def cancel_linked_task(): def cancel_linked_task():
nonlocal task nonlocal task
@ -238,7 +254,7 @@ class Facet:
await coro_fn(self) await coro_fn(self)
finally: finally:
Turn.external(self, cancel_linked_task) Turn.external(self, cancel_linked_task)
task = self.actor._system.loop.create_task(guarded_task()) task = self.loop.create_task(guarded_task())
self.linked_tasks.append(task) self.linked_tasks.append(task)
def _terminate(self, orderly): def _terminate(self, orderly):
@ -345,8 +361,8 @@ class Turn:
return self._facet.prevent_inert_check() return self._facet.prevent_inert_check()
# decorator # decorator
def linked_task(self, loop = None): def linked_task(self, **kwargs):
return lambda coro_fn: self._facet.linked_task(coro_fn, loop = loop) return lambda coro_fn: self._facet.linked_task(coro_fn, **kwargs)
def stop(self, facet = None, continuation = None): def stop(self, facet = None, continuation = None):
if facet is None: if facet is None:

View File

@ -473,5 +473,4 @@ def run_stdio_service(entity):
# decorator # decorator
def service(**kwargs): def service(**kwargs):
return lambda entity: \ return lambda entity: actor.run_system(**kwargs)(lambda: run_stdio_service(entity))
actor.start_actor_system(lambda: run_stdio_service(entity), **kwargs)