我想为我的一个项目做一个装饰器,每隔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())
并且我无法运行另一个循环,因为如果执行该操作,似乎会关闭该循环。关于如何进行这项工作的任何想法?
答案 0 :(得分:0)
您似乎希望同时运行多个功能。因此,您可以使用asyncio.Task
或asyncio.create_task
创建任务并将其添加到列表中,然后使用asyncio.wait
或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())