Compare commits

..

1 Commits

Author SHA1 Message Date
Tyler Goodlet 71cf9e7bd3 First draft, `asyncio`-task, sync-pausing Bo
Mostly due to magic from @oremanj where we slap in a little bit of
`.from_asyncio`-type stuff to run a `trio`-task from `asyncio.Task`
code!

I'm not gonna go into tooo too much detail but basically the primary
thing needed was a way to (blocking-ly) invoke a `trio.lowlevel.Task`
from an `asyncio` one (which we now have with a new
`run_trio_task_in_future()` thanks to draft code from the aforementioned
jefe) which we now invoke from a dedicated aio case-branch inside
`.devx._debug.pause_from_sync()`. Further include a case inside
`DebugStatus.release()` to handle using the same func to set the
`repl_release: trio.Event` from the aio side when releasing the REPL on
exit cmds.

Prolly more refinements to come ;{o
2024-07-15 11:37:17 -04:00
2 changed files with 11 additions and 16 deletions

View File

@ -83,13 +83,15 @@ async def main(
debug_mode=True, debug_mode=True,
maybe_enable_greenback=True, maybe_enable_greenback=True,
# loglevel='devx', # loglevel='devx',
# loglevel='runtime',
) as n: ) as n:
ptl: Portal = await n.start_actor( ptl: Portal = await n.start_actor(
'aio_daemon', 'aio_daemon',
enable_modules=[__name__], enable_modules=[__name__],
infect_asyncio=True, infect_asyncio=True,
debug_mode=True, debug_mode=True,
# loglevel='cancel', loglevel='cancel',
) )
async with ptl.open_context( async with ptl.open_context(

View File

@ -2491,7 +2491,10 @@ def pause_from_sync(
message += ( message += (
f'-> called from a root-actor bg {thread}\n' f'-> called from a root-actor bg {thread}\n'
) )
elif is_aio:
message += (
f'-> called from a `asyncio`-task bg {thread}\n'
)
message += ( message += (
'-> scheduling `._pause_from_bg_root_thread()`..\n' '-> scheduling `._pause_from_bg_root_thread()`..\n'
) )
@ -2513,6 +2516,7 @@ def pause_from_sync(
**_pause_kwargs, **_pause_kwargs,
), ),
), ),
trio_token=trio.lowlevel.current_trio_token(),
) )
DebugStatus.shield_sigint() DebugStatus.shield_sigint()
message += ( message += (
@ -2548,7 +2552,6 @@ def pause_from_sync(
elif is_aio: elif is_aio:
greenback: ModuleType = maybe_import_greenback() greenback: ModuleType = maybe_import_greenback()
repl_owner: Task = asyncio.current_task() repl_owner: Task = asyncio.current_task()
DebugStatus.shield_sigint()
fute: asyncio.Future = run_trio_task_in_future( fute: asyncio.Future = run_trio_task_in_future(
partial( partial(
_pause, _pause,
@ -2564,7 +2567,6 @@ def pause_from_sync(
**_pause_kwargs **_pause_kwargs
) )
) )
# TODO: for async version -> `.pause_from_aio()`? # TODO: for async version -> `.pause_from_aio()`?
# bg_task, _ = await fute # bg_task, _ = await fute
bg_task, _ = greenback.await_(fute) bg_task, _ = greenback.await_(fute)
@ -2699,7 +2701,8 @@ _crash_msg: str = (
def _post_mortem( def _post_mortem(
repl: PdbREPL, # normally passed by `_pause()` # provided and passed by `_pause()`
repl: PdbREPL,
# XXX all `partial`-ed in by `post_mortem()` below! # XXX all `partial`-ed in by `post_mortem()` below!
tb: TracebackType, tb: TracebackType,
@ -3016,17 +3019,7 @@ def open_crash_handler(
yield yield
except tuple(catch) as err: except tuple(catch) as err:
if type(err) not in ignore: if type(err) not in ignore:
pdbp.xpm()
# use our re-impl-ed version
_post_mortem(
repl=mk_pdb(),
tb=sys.exc_info()[2],
api_frame=inspect.currentframe().f_back,
)
# XXX NOTE, `pdbp`'s version seems to lose the up-stack
# tb-info?
# pdbp.xpm()
raise raise