Add (first-draft) infected-`asyncio` actor task uses debugger example
							parent
							
								
									4d3c109277
								
							
						
					
					
						commit
						b7341bb81e
					
				|  | @ -0,0 +1,79 @@ | ||||||
|  | import asyncio | ||||||
|  | 
 | ||||||
|  | import trio | ||||||
|  | import tractor | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | async def bp_then_error( | ||||||
|  |     to_trio: trio.MemorySendChannel, | ||||||
|  |     from_trio: asyncio.Queue, | ||||||
|  | 
 | ||||||
|  | ) -> None: | ||||||
|  | 
 | ||||||
|  |     # sync with ``trio``-side (caller) task | ||||||
|  |     to_trio.send_nowait('start') | ||||||
|  | 
 | ||||||
|  |     # NOTE: what happens here inside the hook needs some refinement.. | ||||||
|  |     # => seems like it's still `._debug._set_trace()` but | ||||||
|  |     #    we set `Lock.local_task_in_debug = 'sync'`, we probably want | ||||||
|  |     #    some further, at least, meta-data about the task/actoq in debug | ||||||
|  |     #    in terms of making it clear it's asyncio mucking about. | ||||||
|  | 
 | ||||||
|  |     breakpoint() | ||||||
|  | 
 | ||||||
|  |     await asyncio.sleep(0.5) | ||||||
|  |     raise ValueError('blah') | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | async def aio_sleep_forever(): | ||||||
|  |     await asyncio.sleep(float('inf')) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @tractor.context | ||||||
|  | async def trio_ctx( | ||||||
|  |     ctx: tractor.Context, | ||||||
|  | ): | ||||||
|  | 
 | ||||||
|  |     # this will block until the ``asyncio`` task sends a "first" | ||||||
|  |     # message, see first line in above func. | ||||||
|  |     async with ( | ||||||
|  |         tractor.to_asyncio.open_channel_from(bp_then_error) as (first, chan), | ||||||
|  |         trio.open_nursery() as n, | ||||||
|  |     ): | ||||||
|  | 
 | ||||||
|  |         assert first == 'start' | ||||||
|  |         await ctx.started(first) | ||||||
|  | 
 | ||||||
|  |         n.start_soon( | ||||||
|  |             tractor.to_asyncio.run_task, | ||||||
|  |             aio_sleep_forever, | ||||||
|  |         ) | ||||||
|  |         await trio.sleep_forever() | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | async def main(): | ||||||
|  | 
 | ||||||
|  |     async with tractor.open_nursery() as n: | ||||||
|  | 
 | ||||||
|  |         p = await n.start_actor( | ||||||
|  |             'aio_daemon', | ||||||
|  |             enable_modules=[__name__], | ||||||
|  |             infect_asyncio=True, | ||||||
|  |             debug_mode=True, | ||||||
|  |             loglevel='cancel', | ||||||
|  |         ) | ||||||
|  | 
 | ||||||
|  |         async with p.open_context(trio_ctx) as (ctx, first): | ||||||
|  | 
 | ||||||
|  |             assert first == 'start' | ||||||
|  |             await trio.sleep_forever() | ||||||
|  | 
 | ||||||
|  |             assert 0 | ||||||
|  | 
 | ||||||
|  |         # TODO: case where we cancel from trio-side while asyncio task | ||||||
|  |         # has debugger lock? | ||||||
|  |         # await p.cancel_actor() | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | if __name__ == '__main__': | ||||||
|  |     trio.run(main) | ||||||
		Loading…
	
		Reference in New Issue