You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					88 lines
				
				3.0 KiB
			
		
		
			
		
	
	
					88 lines
				
				3.0 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								import typing
							 | 
						||
| 
								 | 
							
								from abc import ABCMeta, abstractmethod
							 | 
						||
| 
								 | 
							
								from types import TracebackType
							 | 
						||
| 
								 | 
							
								from typing import Any, Callable, Coroutine, Optional, Type, TypeVar
							 | 
						||
| 
								 | 
							
								from warnings import warn
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if typing.TYPE_CHECKING:
							 | 
						||
| 
								 | 
							
								    from anyio._core._tasks import CancelScope
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								T_Retval = TypeVar('T_Retval')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class TaskStatus(metaclass=ABCMeta):
							 | 
						||
| 
								 | 
							
								    @abstractmethod
							 | 
						||
| 
								 | 
							
								    def started(self, value: object = None) -> None:
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        Signal that the task has started.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        :param value: object passed back to the starter of the task
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class TaskGroup(metaclass=ABCMeta):
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								    Groups several asynchronous tasks together.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    :ivar cancel_scope: the cancel scope inherited by all child tasks
							 | 
						||
| 
								 | 
							
								    :vartype cancel_scope: CancelScope
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    cancel_scope: 'CancelScope'
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    async def spawn(self, func: Callable[..., Coroutine[Any, Any, Any]],
							 | 
						||
| 
								 | 
							
								                    *args: object, name: object = None) -> None:
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        Start a new task in this task group.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        :param func: a coroutine function
							 | 
						||
| 
								 | 
							
								        :param args: positional arguments to call the function with
							 | 
						||
| 
								 | 
							
								        :param name: name of the task, for the purposes of introspection and debugging
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        .. deprecated:: 3.0
							 | 
						||
| 
								 | 
							
								           Use :meth:`start_soon` instead. If your code needs AnyIO 2 compatibility, you
							 | 
						||
| 
								 | 
							
								           can keep using this until AnyIO 4.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        warn('spawn() is deprecated -- use start_soon() (without the "await") instead',
							 | 
						||
| 
								 | 
							
								             DeprecationWarning)
							 | 
						||
| 
								 | 
							
								        self.start_soon(func, *args, name=name)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    @abstractmethod
							 | 
						||
| 
								 | 
							
								    def start_soon(self, func: Callable[..., Coroutine[Any, Any, Any]],
							 | 
						||
| 
								 | 
							
								                   *args: object, name: object = None) -> None:
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        Start a new task in this task group.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        :param func: a coroutine function
							 | 
						||
| 
								 | 
							
								        :param args: positional arguments to call the function with
							 | 
						||
| 
								 | 
							
								        :param name: name of the task, for the purposes of introspection and debugging
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        .. versionadded:: 3.0
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    @abstractmethod
							 | 
						||
| 
								 | 
							
								    async def start(self, func: Callable[..., Coroutine[Any, Any, Any]],
							 | 
						||
| 
								 | 
							
								                    *args: object, name: object = None) -> object:
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        Start a new task and wait until it signals for readiness.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        :param func: a coroutine function
							 | 
						||
| 
								 | 
							
								        :param args: positional arguments to call the function with
							 | 
						||
| 
								 | 
							
								        :param name: name of the task, for the purposes of introspection and debugging
							 | 
						||
| 
								 | 
							
								        :return: the value passed to ``task_status.started()``
							 | 
						||
| 
								 | 
							
								        :raises RuntimeError: if the task finishes without calling ``task_status.started()``
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        .. versionadded:: 3.0
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    @abstractmethod
							 | 
						||
| 
								 | 
							
								    async def __aenter__(self) -> 'TaskGroup':
							 | 
						||
| 
								 | 
							
								        """Enter the task group context and allow starting new tasks."""
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    @abstractmethod
							 | 
						||
| 
								 | 
							
								    async def __aexit__(self, exc_type: Optional[Type[BaseException]],
							 | 
						||
| 
								 | 
							
								                        exc_val: Optional[BaseException],
							 | 
						||
| 
								 | 
							
								                        exc_tb: Optional[TracebackType]) -> Optional[bool]:
							 | 
						||
| 
								 | 
							
								        """Exit the task group context waiting for all tasks to finish."""
							 |