Use `trio.Process.__aexit__()` and pass the actor uid
Using the context manager interface does some extra teardown beyond simply calling `.wait()`. Pass the subactor's "uid" on the exec line for debugging purposes when monitoring the process tree from the OS. Hard code the child script module path to avoid a double import warning.drop_cloudpickle
							parent
							
								
									a215df8dfc
								
							
						
					
					
						commit
						aa620fe61d
					
				| 
						 | 
				
			
			@ -157,24 +157,26 @@ async def cancel_on_completion(
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
@asynccontextmanager
 | 
			
		||||
async def run_in_process(async_fn, *args, **kwargs):
 | 
			
		||||
async def run_in_process(subactor, async_fn, *args, **kwargs):
 | 
			
		||||
    encoded_job = cloudpickle.dumps(partial(async_fn, *args, **kwargs))
 | 
			
		||||
    p = await trio.open_process(
 | 
			
		||||
 | 
			
		||||
    async with await trio.open_process(
 | 
			
		||||
        [
 | 
			
		||||
            sys.executable,
 | 
			
		||||
            "-m",
 | 
			
		||||
            _child.__name__
 | 
			
		||||
            # Hardcode this (instead of using ``_child.__name__`` to avoid a
 | 
			
		||||
            # double import warning: https://stackoverflow.com/a/45070583
 | 
			
		||||
            "tractor._child",
 | 
			
		||||
            # This is merely an identifier for debugging purposes when
 | 
			
		||||
            # viewing the process tree from the OS
 | 
			
		||||
            str(subactor.uid),
 | 
			
		||||
        ],
 | 
			
		||||
        stdin=subprocess.PIPE
 | 
			
		||||
    )
 | 
			
		||||
        stdin=subprocess.PIPE,
 | 
			
		||||
    ) as proc:
 | 
			
		||||
 | 
			
		||||
    # send over func to call
 | 
			
		||||
    await p.stdin.send_all(encoded_job)
 | 
			
		||||
 | 
			
		||||
    yield p
 | 
			
		||||
 | 
			
		||||
    # wait for termination
 | 
			
		||||
    await p.wait()
 | 
			
		||||
        # send func object to call in child
 | 
			
		||||
        await proc.stdin.send_all(encoded_job)
 | 
			
		||||
        yield proc
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
async def new_proc(
 | 
			
		||||
| 
						 | 
				
			
			@ -200,6 +202,7 @@ async def new_proc(
 | 
			
		|||
    async with trio.open_nursery() as nursery:
 | 
			
		||||
        if use_trio_run_in_process or _spawn_method == 'trio':
 | 
			
		||||
            async with run_in_process(
 | 
			
		||||
                subactor,
 | 
			
		||||
                _trio_main,
 | 
			
		||||
                subactor,
 | 
			
		||||
                bind_addr,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue