Запуск нескольких вечных циклов параллельно

У меня есть следующий код

from pyrogram import Client, filters
from settings import *

app = Client("my_account", api_id=api_id, api_hash=api_hash)

groups_id = {-1001694: 20, -1001786: 10}  # вместо настоящих айди фейковые


def send(app, id, time):
    while True:
        app.send_message(id, "test222")
        sleep(time)

with app:
    for id, time in groups_id.items():
        send(app, id, time)  # строка запуска

так вот вопрос: как запустить send несколько раз, т.е. после "строки запуска" цикл продолжал работать как будто вечного цикла нет, но при этом что бы он на деле работал? я пробовал через асинхронность и паралельность, но ничего не сработало

вот версия асинхронности:

from settings import *
import asyncio

app = Client("my_account", api_id=api_id, api_hash=api_hash)

groups_id = {-1001694: 20, -1001786: 10}  # вместо настоящих айди фейковые


async def send(app, id, time):
    while True:
        await app.send_message(id, "test222")
        await asyncio.sleep(time)

async def main():
    async with app:
        for id, time in groups_id.items():
            await send(app, id, time)  # строка запуска

asyncio.run(main())

но тут итог тот же, отправка только в одну группу

update: спасибо этому человеку за ответ: insolor

вот итоговый код:

from settings import *
import asyncio

app = Client("my_account", api_id=api_id, api_hash=api_hash)

groups_id = {-100169: 20, -1001729: 10}  # вместо настоящих айди фейковые


async def send(app, id, time):
    while True:
        await app.send_message(id, "test222")
        await asyncio.sleep(time)

async def main():
    async with app:
        await asyncio.gather(*[send(app, id, time) for id, time in groups_id.items()])

asyncio.run(main())

Ответы (1 шт):

Автор решения: insolor

Такой код:

for id, time in groups_id.items():
    await send(app, id, time)  # строка запуска

ждёт (await) пока закончится каждый send, который у вас бесконечный. Чтобы все отправки работали одновременно, нужно использовать функцию asyncio.gather:

await asyncio.gather(*[send(app, id, time) for id, time in groups_id.items()])

Тут все корутины сначала собираются в список, потом "все вместе" запускаются.

Итоговый код:

from settings import *
import asyncio

app = Client("my_account", api_id=api_id, api_hash=api_hash)

groups_id = {-100169: 20, -1001729: 10}  # вместо настоящих айди фейковые


async def send(app, id, time):
    while True:
        await app.send_message(id, "test222")
        await asyncio.sleep(time)


async def main():
    async with app:
        await asyncio.gather(*[send(app, id, time) for id, time in groups_id.items()])


asyncio.run(main())
→ Ссылка