First stab at tackling issues involved in running Syndicate in a multi-threaded context

This commit is contained in:
Tony Garnock-Jones 2022-01-11 20:53:59 +01:00
parent 2b5a0cdf02
commit c0afd99e46
2 changed files with 18 additions and 8 deletions

View File

@ -12,11 +12,14 @@ def __setup():
class turn: class turn:
@staticproperty @staticproperty
def active(): def active():
return _active.turn t = getattr(_active, 'turn', False)
if t is False:
t = _active.turn = None
return t
@staticproperty @staticproperty
def log(): def log():
return _active.turn.log return turn.active.log
def run(facet, action): def run(facet, action):
Turn.run(facet, action) Turn.run(facet, action)
@ -25,11 +28,11 @@ def __setup():
Turn.external(facet, action, loop=loop) Turn.external(facet, action, loop=loop)
def active_facet(): def active_facet():
return _active.turn._facet return turn.active._facet
def install_definition(name, definition): def install_definition(name, definition):
def handler(*args, **kwargs): def handler(*args, **kwargs):
return definition(_active.turn, *args, **kwargs) return definition(turn.active, *args, **kwargs)
setattr(turn, name, handler) setattr(turn, name, handler)
for (name, definition) in Turn.__dict__.items(): for (name, definition) in Turn.__dict__.items():

View File

@ -284,7 +284,10 @@ def queue_task_threadsafe(thunk, loop = None):
class Turn: class Turn:
@staticproperty @staticproperty
def active(): def active():
return _active.turn t = getattr(_active, 'turn', False)
if t is False:
t = _active.turn = None
return t
@classmethod @classmethod
def run(cls, facet, action, zombie_turn = False): def run(cls, facet, action, zombie_turn = False):
@ -551,7 +554,11 @@ def __boot_inert():
async def __run_inert(): async def __run_inert():
Actor(__boot_inert, name = '_inert_actor') Actor(__boot_inert, name = '_inert_actor')
def __setup_inert(): def __setup_inert():
def setup_main():
loop = asyncio.new_event_loop() loop = asyncio.new_event_loop()
loop.run_until_complete(__run_inert()) loop.run_until_complete(__run_inert())
loop.close() loop.close()
t = threading.Thread(target=setup_main)
t.start()
t.join()
__setup_inert() __setup_inert()