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