2.6. Context#
Services can require each other’s data. In this case, you should use Context
.
Context
is a repository associated with the running entrypoint
.
Context
-object will be created when entrypoint
starts and linked
to the running event loop.
Cross-dependent services might await or set each other’s data via the context.
For service instances self.context
is available since entrypoint
started. In other cases get_context()
function returns current 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):
# querying from remote server
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
Note
It’s not a silver bullet. In base case services can be configured by
passing kwargs to the service __init__
method.