Используйте декораторы таймера для запуска методов telethon
Я хочу сделать декоратор для моего проекта, который будет запускать каждые x секунд определенные задачи телетарафона.
Я спросил в группе телетонов, и кто-то дал мне небольшой декоратор, но проблема в том, что мне нужно запустить цикл, используя run_until_complete
и я уже использую его при запуске клиента. Вот мой код:
def periodic(period):
def scheduler(fcn):
async def wrapper():
while True:
asyncio.ensure_future(fcn())
await asyncio.sleep(period)
return wrapper
return scheduler
@periodic(2)
async def do_something():
await asyncio.sleep(5) # Do some heavy calculation
me = await client.get_me()
print(me.stingfy())
Теперь у меня уже есть цикл, работающий в main:
if __name__ == "__main__":
async def start():
await client.start()
await client.get_me()
await client.run_until_disconnected()
loop = asyncio.get_event_loop()
loop.run_until_complete(start())
и я не могу запустить еще один цикл, потому что, если я сделаю это, он, похоже, закроет этот. Любые идеи о том, как сделать эту работу?
1 ответ
Решение
Похоже, вы хотите запустить несколько функций одновременно. Так что вы можете использовать asyncio.Task
или же asyncio.create_task
создавать задачи и добавлять их в список, а затем запустить их с помощью asyncio.wait
или т. д.
import asyncio
def periodic(period):
def scheduler(fcn):
async def wrapper():
while 1:
asyncio.ensure_future(fcn())
await asyncio.sleep(period)
return wrapper
return scheduler
@periodic(2)
async def do_something():
print("Im running")
async def client():
while 1:
await asyncio.sleep(1)
print("This is client")
if __name__ == "__main__":
async def start():
task = [asyncio.Task(client()),
asyncio.Task(do_something())]
done, pending = await asyncio.wait(task)
loop = asyncio.get_event_loop()
loop.run_until_complete(start())