Add resource base class for async resources

This commit is contained in:
Roman Mogylatov 2020-11-29 19:42:45 -05:00
parent fc2633faa3
commit d50fbbd83b
3 changed files with 2151 additions and 1673 deletions

File diff suppressed because it is too large Load Diff

View File

@ -2735,6 +2735,19 @@ cdef class Resource(Provider):
self.__kwargs_len,
)
self.__shutdowner = initializer.shutdown
elif self._is_async_resource_subclass(self.__initializer):
initializer = self.__initializer()
async_init = __call(
initializer.init,
args,
self.__args,
self.__args_len,
kwargs,
self.__kwargs,
self.__kwargs_len,
)
self.__initialized = True
return __async_resource_init(self, async_init, initializer.shutdown)
elif inspect.isgeneratorfunction(self.__initializer):
initializer = __call(
self.__initializer,
@ -2796,6 +2809,15 @@ cdef class Resource(Provider):
from . import resources
return issubclass(instance, resources.Resource)
@staticmethod
def _is_async_resource_subclass(instance):
if sys.version_info < (3, 5):
return False
if not isinstance(instance, CLASS_TYPES):
return
from . import resources
return issubclass(instance, resources.AsyncResource)
cdef class Container(Provider):
"""Container provider provides an instance of declarative container.

View File

@ -29,3 +29,14 @@ class Resource(Generic[T], metaclass=ResourceMeta):
@abc.abstractmethod
def shutdown(self, resource: T) -> None:
...
class AsyncResource(Generic[T], metaclass=ResourceMeta):
@abc.abstractmethod
async def init(self, *args, **kwargs) -> T:
...
@abc.abstractmethod
async def shutdown(self, resource: T) -> None:
...