changed region methods to async

This commit is contained in:
Devaev Maxim 2020-03-02 01:26:43 +03:00
parent e855976f05
commit 8972357dbc
5 changed files with 31 additions and 32 deletions

View File

@ -32,7 +32,6 @@ import typing
from typing import List
from typing import Callable
from typing import Coroutine
from typing import Generator
from typing import AsyncGenerator
from typing import Type
from typing import TypeVar
@ -136,34 +135,34 @@ class AioExclusiveRegion:
def is_busy(self) -> bool:
return self.__busy
def enter(self) -> None:
async def enter(self) -> None:
if not self.__busy:
self.__busy = True
return
raise self.__exc_type()
def exit(self) -> None:
async def exit(self) -> None:
self.__busy = False
@contextlib.contextmanager
def exit_only_on_exception(self) -> Generator[None, None, None]:
self.enter()
@contextlib.asynccontextmanager
async def exit_only_on_exception(self) -> AsyncGenerator[None, None]:
await self.enter()
try:
yield
except: # noqa: E722
self.exit()
await self.exit()
raise
def __enter__(self) -> None:
self.enter()
async def __aenter__(self) -> None:
await self.enter()
def __exit__(
async def __aexit__(
self,
_exc_type: Type[BaseException],
_exc: BaseException,
_tb: types.TracebackType,
) -> None:
self.exit()
await self.exit()
# =====

View File

@ -162,7 +162,7 @@ class Plugin(BaseAtx): # pylint: disable=too-many-instance-attributes
@aiotools.atomic
async def __click(self, name: str, pin: int, delay: float) -> None:
with self.__region.exit_only_on_exception():
async with self.__region.exit_only_on_exception():
await self.__inner_click(name, pin, delay)
@aiotools.tasked
@ -176,5 +176,5 @@ class Plugin(BaseAtx): # pylint: disable=too-many-instance-attributes
gpio.write(pin, False)
await asyncio.sleep(1)
finally:
self.__region.exit()
await self.__region.exit()
get_logger(0).info("Clicked ATX button %r", name)

View File

@ -114,7 +114,7 @@ class _State:
@contextlib.asynccontextmanager
async def busy(self, check_online: bool=True) -> AsyncGenerator[None, None]:
with self._region:
async with self._region:
async with self._lock:
await self.__notifier.notify()
if check_online:
@ -304,7 +304,7 @@ class Plugin(BaseMsd): # pylint: disable=too-many-instance-attributes
@contextlib.asynccontextmanager
async def write_image(self, name: str) -> AsyncGenerator[None, None]:
try:
with self.__state._region: # pylint: disable=protected-access
async with self.__state._region: # pylint: disable=protected-access
try:
async with self.__state._lock: # pylint: disable=protected-access
await self.__state_notifier.notify()

View File

@ -234,7 +234,7 @@ class Plugin(BaseMsd): # pylint: disable=too-many-instance-attributes
@aiotools.atomic
async def reset(self) -> None:
with self.__region.exit_only_on_exception():
async with self.__region.exit_only_on_exception():
await self.__inner_reset()
@aiotools.tasked
@ -254,7 +254,7 @@ class Plugin(BaseMsd): # pylint: disable=too-many-instance-attributes
try:
gpio.write(self.__reset_pin, False)
finally:
self.__region.exit()
await self.__region.exit()
await self.__state_queue.put(await self.get_state())
@aiotools.atomic
@ -277,7 +277,7 @@ class Plugin(BaseMsd): # pylint: disable=too-many-instance-attributes
async with self.__working():
notify = False
try:
with self.__region:
async with self.__region:
if self.__connected:
raise MsdConnectedError()
notify = True
@ -294,7 +294,7 @@ class Plugin(BaseMsd): # pylint: disable=too-many-instance-attributes
async with self.__working():
notify = False
try:
with self.__region:
async with self.__region:
if not self.__connected:
raise MsdDisconnectedError()
notify = True
@ -315,7 +315,7 @@ class Plugin(BaseMsd): # pylint: disable=too-many-instance-attributes
@contextlib.asynccontextmanager
async def write_image(self, name: str) -> AsyncGenerator[None, None]:
async with self.__working():
self.__region.enter()
await self.__region.enter()
try:
assert self.__device_info
if self.__connected:
@ -333,7 +333,7 @@ class Plugin(BaseMsd): # pylint: disable=too-many-instance-attributes
await self.__close_device_file()
await self.__load_device_info()
finally:
self.__region.exit()
await self.__region.exit()
await self.__state_queue.put(await self.get_state())
async def write_image_chunk(self, chunk: bytes) -> int:

View File

@ -39,14 +39,14 @@ async def test_ok__region__access_one() -> None:
async def func() -> None:
assert not region.is_busy()
with region:
async with region:
assert region.is_busy()
assert not region.is_busy()
await func()
assert not region.is_busy()
region.exit()
await region.exit()
assert not region.is_busy()
@ -56,16 +56,16 @@ async def test_fail__region__access_one() -> None:
async def func() -> None:
assert not region.is_busy()
with region:
async with region:
assert region.is_busy()
region.enter()
await region.enter()
assert not region.is_busy()
with pytest.raises(RegionIsBusyError):
await func()
assert not region.is_busy()
region.exit()
await region.exit()
assert not region.is_busy()
@ -75,21 +75,21 @@ async def test_ok__region__access_two() -> None:
region = AioExclusiveRegion(RegionIsBusyError)
async def func1() -> None:
with region:
async with region:
await asyncio.sleep(1)
print("done func1()")
async def func2() -> None:
await asyncio.sleep(2)
print("waiking up func2()")
with region:
async with region:
await asyncio.sleep(1)
print("done func2()")
await asyncio.gather(func1(), func2())
assert not region.is_busy()
region.exit()
await region.exit()
assert not region.is_busy()
@ -98,13 +98,13 @@ async def test_fail__region__access_two() -> None:
region = AioExclusiveRegion(RegionIsBusyError)
async def func1() -> None:
with region:
async with region:
await asyncio.sleep(2)
print("done func1()")
async def func2() -> None:
await asyncio.sleep(1)
with region:
async with region:
await asyncio.sleep(1)
print("done func2()")
@ -113,5 +113,5 @@ async def test_fail__region__access_two() -> None:
assert type(results[1]) == RegionIsBusyError # pylint: disable=unidiomatic-typecheck
assert not region.is_busy()
region.exit()
await region.exit()
assert not region.is_busy()