[英]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.