繁体   English   中英

Asyncio如何每天运行一次必须完成的事情

[英]Asyncio how to run something once a day that must complete

我对 Async.io 很陌生,我将它与 Discord.py 一起使用来创建一个机器人。 一天一次,我需要更新一个电子表格,但问题是电子表格已经有点长了,所以它现在触发了循环的默认超时。 有没有办法克服这个? 我已经看到run_until_complete但正如您在下面看到的那样,有一个await asyncio.sleep(86400) ,据我了解,它不能等待直到完成,因为它会等待一天? 我也可以只更改 function 的超时,然后在完成后将其更改回来,但我找不到任何资源。

这是需要每天重复的function:

async def updateSheet():
    while True:
        print("Updating Sheet at " + datetime.now().strftime("%H:%M"))
        
        user.updateAllUsers(os.getenv('CID'), os.getenv('CS'), subs) #This is the function that takes too long
        
        print("Done Updating")
        await asyncio.sleep(86400)

这是我将它添加到循环中的方式(因为我使用的是 Discord.py):

@client.event
async def on_ready():
    print('We have logged in as {0.user}'.format(client))
    client.loop.create_task(updateSheet())

任何和所有的帮助都将不胜感激,因为只要这是失败的,我的项目就会失去宝贵的时间。 :)

如果有东西阻塞,直接方法将尝试将其转换为任务,这在您的情况下可能是不可能的。 所以我们必须使用像 APS 这样的东西来安排作业。

sched = Scheduler()
sched.start()
@sched.cron_schedule(day='mon-fri')
def task():
    user.updateAllUsers(os.getenv('CID'), os.getenv('CS'), subs)

确保在单独的文件中执行此操作,并为任务使用异步调度程序。

您可以简单地测量 function 执行所需的时间,然后从86400中减去它

import time

async def updateSheet():
    while True:
        start = time.monotonic()
        print("Updating Sheet at " + datetime.now().strftime("%H:%M"))
        
        user.updateAllUsers(os.getenv('CID'), os.getenv('CS'), subs) #This is the function that takes too long

        end = time.monotonic()
        total = end - start
        sleep_time = 86400 - total
        await asyncio.sleep(sleep_time)

我真的建议您以非阻塞方式运行阻塞功能,请参阅我以前的答案之一以获取更多信息,( “阻塞”是什么意思

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM