Используйте декораторы таймера для запуска методов telethon - PullRequest
0 голосов
/ 22 декабря 2018

Я хочу сделать декоратор для моего проекта, который будет запускать каждые 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 Ответ

0 голосов
/ 23 декабря 2018

Похоже, вы хотите запустить несколько функций одновременно.Таким образом, вы можете использовать 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())
...