Add an async actor cluster spawner prototype
							parent
							
								
									c2a19c630b
								
							
						
					
					
						commit
						6988e8d3c8
					
				|  | @ -0,0 +1,49 @@ | ||||||
|  | ''' | ||||||
|  | Actor cluster helpers. | ||||||
|  | 
 | ||||||
|  | ''' | ||||||
|  | from contextlib import asynccontextmanager as acm | ||||||
|  | from multiprocessing import cpu_count | ||||||
|  | from typing import AsyncGenerator, Optional | ||||||
|  | 
 | ||||||
|  | import trio | ||||||
|  | import tractor | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @acm | ||||||
|  | async def open_actor_cluster( | ||||||
|  | 
 | ||||||
|  |     modules: list[str], | ||||||
|  |     count: int = cpu_count(), | ||||||
|  |     names: Optional[list[str]] = None, | ||||||
|  | 
 | ||||||
|  | ) -> AsyncGenerator[..., dict[str, tractor.Portal]]: | ||||||
|  | 
 | ||||||
|  |     portals: dict[str, tractor.Portal] = {} | ||||||
|  |     uid = tractor.current_actor().uid | ||||||
|  | 
 | ||||||
|  |     if not names: | ||||||
|  |         suffix = '_'.join(uid) | ||||||
|  |         names = [f'worker_{i}.' + suffix for i in range(count)] | ||||||
|  | 
 | ||||||
|  |     if not len(names) == count: | ||||||
|  |         raise ValueError( | ||||||
|  |             'Number of names is {len(names)} but count it {count}') | ||||||
|  | 
 | ||||||
|  |     async with ( | ||||||
|  |         tractor.open_nursery() as an, | ||||||
|  |         trio.open_nursery() as n, | ||||||
|  |     ): | ||||||
|  |         for index, key in zip(range(count), names): | ||||||
|  | 
 | ||||||
|  |             async def start(i) -> None: | ||||||
|  |                 key = f'worker_{i}.' + '_'.join(uid) | ||||||
|  |                 portals[key] = await an.start_actor( | ||||||
|  |                     enable_modules=modules, | ||||||
|  |                     name=key, | ||||||
|  |                 ) | ||||||
|  | 
 | ||||||
|  |             n.start_soon(start, index) | ||||||
|  | 
 | ||||||
|  |         assert len(portals) == count | ||||||
|  |         yield portals | ||||||
		Loading…
	
		Reference in New Issue