使用计时器装饰器触发Telethon方法

时间:2018-12-22 20:42:24

标签: python python-3.x python-asyncio telethon

我想为我的一个项目做一个装饰器,每隔x秒就会启动某些Telethon任务。

我在telethon小组中问过,有人给我一个小的装饰器,但是这里的问题是我需要使用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 :(得分:0)

您似乎希望同时运行多个功能。因此,您可以使用asyncio.Taskasyncio.create_task创建任务并将其添加到列表中,然后使用asyncio.waitetc来运行它们。

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())
相关问题