Try out trip as the default spawn_method on unix for now
							parent
							
								
									f1a96c1680
								
							
						
					
					
						commit
						ddbf55768f
					
				|  | @ -4,6 +4,7 @@ tractor: An actor model micro-framework built on | |||
| """ | ||||
| import importlib | ||||
| from functools import partial | ||||
| import platform | ||||
| from typing import Tuple, Any, Optional | ||||
| import typing | ||||
| 
 | ||||
|  | @ -99,15 +100,18 @@ def run( | |||
|     name: Optional[str] = None, | ||||
|     arbiter_addr: Tuple[str, int] = ( | ||||
|         _default_arbiter_host, _default_arbiter_port), | ||||
|     # the `multiprocessing` start method: | ||||
|     # either the `multiprocessing` start method: | ||||
|     # https://docs.python.org/3/library/multiprocessing.html#contexts-and-start-methods | ||||
|     start_method: str = 'forkserver', | ||||
|     # OR `trio-run-in-process` (the new default). | ||||
|     start_method: str = 'trip', | ||||
|     **kwargs, | ||||
| ) -> Any: | ||||
|     """Run a trio-actor async function in process. | ||||
| 
 | ||||
|     This is tractor's main entry and the start point for any async actor. | ||||
|     """ | ||||
|     if platform.system() == 'Windows': | ||||
|         start_method = 'spawn'  # only one supported for now | ||||
|     _spawn.try_set_start_method(start_method) | ||||
|     return trio.run(_main, async_fn, args, kwargs, arbiter_addr, name) | ||||
| 
 | ||||
|  |  | |||
|  | @ -34,6 +34,7 @@ from ._actor import Actor, ActorFailure | |||
| log = get_logger('tractor') | ||||
| 
 | ||||
| _ctx: mp.context.BaseContext = mp.get_context("spawn")  # type: ignore | ||||
| _spawn_method: str = "spawn" | ||||
| 
 | ||||
| 
 | ||||
| if platform.system() == 'Windows': | ||||
|  | @ -51,21 +52,31 @@ def try_set_start_method(name: str) -> mp.context.BaseContext: | |||
|     method) is used. | ||||
|     """ | ||||
|     global _ctx | ||||
|     global _spawn_method | ||||
| 
 | ||||
|     allowed = mp.get_all_start_methods() | ||||
| 
 | ||||
|     # no Windows support for trip yet (afaik) | ||||
|     if platform.system() != 'Windows': | ||||
|         allowed += ['trip'] | ||||
| 
 | ||||
|     if name not in allowed: | ||||
|         name = 'spawn' | ||||
|         raise ValueError( | ||||
|             f"Spawn method {name} is unsupported please choose one of {allowed}" | ||||
|         ) | ||||
| 
 | ||||
|     if name == 'trip': | ||||
|         _spawn_method = name | ||||
|         return name | ||||
| 
 | ||||
|     elif name == 'fork': | ||||
|         raise ValueError( | ||||
|             "`fork` is unsupported due to incompatibility with `trio`" | ||||
|         ) | ||||
|     elif name == 'forkserver': | ||||
|         _forkserver_override.override_stdlib() | ||||
|         _ctx = mp.get_context(name) | ||||
| 
 | ||||
|     assert name in allowed | ||||
| 
 | ||||
|     _ctx = mp.get_context(name) | ||||
|     return _ctx | ||||
| 
 | ||||
| 
 | ||||
|  | @ -144,7 +155,7 @@ async def new_proc( | |||
|     bind_addr: Tuple[str, int], | ||||
|     parent_addr: Tuple[str, int], | ||||
|     begin_wait_phase: trio.Event, | ||||
|     use_trip: bool = True, | ||||
|     use_trip: bool = False, | ||||
|     task_status: TaskStatus[Portal] = trio.TASK_STATUS_IGNORED | ||||
| ) -> None: | ||||
|     """Create a new ``multiprocessing.Process`` using the | ||||
|  | @ -153,7 +164,7 @@ async def new_proc( | |||
|     cancel_scope = None | ||||
| 
 | ||||
|     async with trio.open_nursery() as nursery: | ||||
|         if use_trip: | ||||
|         if use_trip or _spawn_method == 'trip': | ||||
|             # trio_run_in_process | ||||
|             async with trio_run_in_process.open_in_process( | ||||
|                 subactor._trip_main, | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue