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__.