2.6. Контекст#
Иногда сервисы должны запрашивать данные друг друга. В этом случае вам следует использовать «Контекст».
Context
по своей сути это репозиторий ассоциированный с запущенным entrypoint
.
Экземпляр класса Context
создается в entrypoint
запускается и ассоциируется с запущенным event loop.
Взаимозависимые сервисы могут ожидать или устанавливать данные друг друга через контекст.
Для сервисов контекст доступн как self.context
с момента запуска Entrypoint. В других случаях функция get_context()
возвращает текущий контекст.
import asyncio
from random import random, randint
from aiomisc import entrypoint, get_context, Service
class LoggingService(Service):
async def start(self):
context = get_context()
wait_time = await context['wait_time']
print('Wait time is', wait_time)
self.start_event.set()
while True:
print('Hello from service', self.name)
await asyncio.sleep(wait_time)
class RemoteConfiguration(Service):
async def start(self):
# Понарошку делаем запрос с удаленного сервера
await asyncio.sleep(random())
self.context['wait_time'] = randint(1, 5)
services = (
LoggingService(name='#1'),
LoggingService(name='#2'),
LoggingService(name='#3'),
RemoteConfiguration()
)
with entrypoint(*services) as loop:
pass
Примечание
Это не панацея. В простом случае службы можно настроить, передав kwargs в __init__
.