0

我想为我的一个项目制作一个装饰器,每隔 x 秒就会启动某个远程马拉松任务。

我在 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())

而且我不能运行另一个循环,因为如果我这样做,它似乎会关闭这个循环。关于如何使这项工作的任何想法?

4

1 回答 1

0

看起来您希望同时运行多个功能。因此,您可以使用asyncio.Taskorasyncio.create_task创建任务并将它们添加到列表中,然后通过 using asyncio.waitor etc运行它们。

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())
于 2018-12-23T05:17:10.980 回答