import asyncio
from typing import Any, Dict
class ADict:
def __init__(self):
self.data: Dict[str, asyncio.Future] = {}
self.lock = asyncio.Lock()
async def get(self, key: str) -> Any:
if key in self.data:
async with self.lock:
return await self.data[key]
self.data[key] = asyncio.Future()
return await self.data[key]
async def set(self, key: str, value: Any) -> None:
async with self.lock:
if key in self.data:
f = self.data[key]
else:
f = asyncio.Future()
f.set_result(value)
self.data[key] = f
def __str__(self):
return f'ADict({self.data})'
async def show_amount(a_dict: ADict, key: str):
amount = await a_dict.get(key)
print(f'GOT: {amount} for {key}')
async def test():
print('TEST START')
a_dict = ADict()
asyncio.create_task(show_amount(a_dict, 'Moscow'))
await asyncio.sleep(1)
await a_dict.set('Moscow', 200000)
await a_dict.set('Spb', 150000)
print(a_dict)
await asyncio.sleep(1)
asyncio.create_task(show_amount(a_dict, 'Moscow'))
asyncio.create_task(show_amount(a_dict, 'Spb'))
await asyncio.sleep(1)
print(a_dict)
print('TEST END')
asyncio.run(test())
aW1wb3J0IGFzeW5jaW8KZnJvbSB0eXBpbmcgaW1wb3J0IEFueSwgRGljdAoKCmNsYXNzIEFEaWN0OgoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLmRhdGE6IERpY3Rbc3RyLCBhc3luY2lvLkZ1dHVyZV0gPSB7fQogICAgICAgIHNlbGYubG9jayA9IGFzeW5jaW8uTG9jaygpCgogICAgYXN5bmMgZGVmIGdldChzZWxmLCBrZXk6IHN0cikgLT4gQW55OgogICAgICAgIGlmIGtleSBpbiBzZWxmLmRhdGE6CiAgICAgICAgICAgIGFzeW5jIHdpdGggc2VsZi5sb2NrOgogICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHNlbGYuZGF0YVtrZXldCgogICAgICAgIHNlbGYuZGF0YVtrZXldID0gYXN5bmNpby5GdXR1cmUoKQogICAgICAgIHJldHVybiBhd2FpdCBzZWxmLmRhdGFba2V5XQoKICAgIGFzeW5jIGRlZiBzZXQoc2VsZiwga2V5OiBzdHIsIHZhbHVlOiBBbnkpIC0+IE5vbmU6CiAgICAgICAgYXN5bmMgd2l0aCBzZWxmLmxvY2s6CiAgICAgICAgICAgIGlmIGtleSBpbiBzZWxmLmRhdGE6CiAgICAgICAgICAgICAgICBmID0gc2VsZi5kYXRhW2tleV0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGYgPSBhc3luY2lvLkZ1dHVyZSgpCiAgICAgICAgICAgIGYuc2V0X3Jlc3VsdCh2YWx1ZSkKICAgICAgICAgICAgc2VsZi5kYXRhW2tleV0gPSBmCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGYnQURpY3Qoe3NlbGYuZGF0YX0pJwoKCmFzeW5jIGRlZiBzaG93X2Ftb3VudChhX2RpY3Q6IEFEaWN0LCBrZXk6IHN0cik6CiAgICBhbW91bnQgPSBhd2FpdCBhX2RpY3QuZ2V0KGtleSkKICAgIHByaW50KGYnR09UOiB7YW1vdW50fSBmb3Ige2tleX0nKQoKCmFzeW5jIGRlZiB0ZXN0KCk6CiAgICBwcmludCgnVEVTVCBTVEFSVCcpCiAgICBhX2RpY3QgPSBBRGljdCgpCiAgICBhc3luY2lvLmNyZWF0ZV90YXNrKHNob3dfYW1vdW50KGFfZGljdCwgJ01vc2NvdycpKQogICAgYXdhaXQgYXN5bmNpby5zbGVlcCgxKQogICAgYXdhaXQgYV9kaWN0LnNldCgnTW9zY293JywgMjAwMDAwKQogICAgYXdhaXQgYV9kaWN0LnNldCgnU3BiJywgMTUwMDAwKQogICAgcHJpbnQoYV9kaWN0KQogICAgYXdhaXQgYXN5bmNpby5zbGVlcCgxKQogICAgYXN5bmNpby5jcmVhdGVfdGFzayhzaG93X2Ftb3VudChhX2RpY3QsICdNb3Njb3cnKSkKICAgIGFzeW5jaW8uY3JlYXRlX3Rhc2soc2hvd19hbW91bnQoYV9kaWN0LCAnU3BiJykpCiAgICBhd2FpdCBhc3luY2lvLnNsZWVwKDEpCiAgICBwcmludChhX2RpY3QpCiAgICBwcmludCgnVEVTVCBFTkQnKQoKCmFzeW5jaW8ucnVuKHRlc3QoKSk=