Запуск нескольких вечных циклов параллельно
У меня есть следующий код
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())