异步如何每天运行一次必须完成的任务



我对Async.io很陌生,我正在将其与Discord.py一起使用来创建一个机器人。我每天需要更新一次电子表格,但问题是电子表格有点长,所以它现在触发了循环的默认超时。有什么可以克服的吗?我见过run_until_complete,但正如你在下面看到的那样,根据我的理解,有一个await asyncio.sleep(86400)在完成之前不会工作,因为它会等待一天?我也可以只更改该函数的超时,然后在它完成后再将其更改回来,但我找不到任何资源。

以下是每天需要重复的功能:

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)

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

您可以简单地测量函数执行所需的时间,并将其从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)

我真的建议你以非阻塞的方式运行阻塞功能,请参阅我之前的一个答案以了解更多信息,("阻塞"是什么意思(