Я думаю, что вы хотите сделать, чтобы убедиться, что функция create_connections выполняется до завершения до конструктора S. Один из способов сделать это - немного изменить ваш код. Переместите функцию create_connections за пределы класса:
async def create_connection():
pub = await aioredis.create_redis("redis://c8:7070/0", password="abc")
sub = await aioredis.create_redis("redis://c8:7070/0", password="abc")
db = await aioredis.create_redis("redis://c8:7070/0", password="abc")
listener = await self.sub.subscribe(f"abc")
return pub, sub, db, listener
Теперь дождитесь этой функции перед построением S. Поэтому ваша основная функция становится такой:
async def main(opts):
loop.create_task(periodic())
x = await create_connections()
s = S(opts, x) # pass the result of create_connections to S
print(s.pub, s.sub)
loop.create_task(s.run_s())
Теперь измените конструктор S, чтобы получать созданные объекты. :
def __init__(self, opts, x):
self.pub, self.sub, self.db, self.listener = x
Я не уверен, что вы пытаетесь сделать с аргументом return_when и вызовом asyncio.wait. Функция create_connections не запускает набор параллельных задач, а ожидает каждого вызова, прежде чем перейти к следующему. Возможно, вы могли бы улучшить производительность, выполнив четыре вызова параллельно, но это другой вопрос.