我的程序应该运行24/7,我希望能够在某个小时/日期运行某些任务。
我已经尝试使用aiocron,但是它仅支持调度功能(不支持协程),并且我读到它并不是一个很好的库。 我的程序是构建的,因此,即使不是我要调度的所有任务,大多数也是在协程中构建的。
是否还有其他库可以进行此类任务调度?
或者,如果不这样做,可以使协程变形以使它们运行正常功能吗?
答案 0 :(得分:2)
我已经尝试使用aiocron,但它仅支持调度功能(不支持协程)
根据您提供的link上的示例,情况似乎并非如此。用@asyncio.coroutine
装饰的功能等效于用async def
定义的协程,您可以互换使用它们。
但是,如果要避免使用aiocron,可以很简单地使用asyncio.sleep
将协程推迟到任意时间点。例如:
import asyncio, datetime
async def wait_for(dt):
# sleep until the specified datetime
while True:
now = datetime.datetime.now()
remaining = (dt - now).total_seconds()
if remaining < 86400:
break
# asyncio.sleep doesn't like long sleeps, so don't sleep more
# than a day at a time
await asyncio.sleep(86400)
await asyncio.sleep(remaining)
async def run_at(dt, coro):
await wait_for(dt)
return await coro
用法示例:
async def hello():
print('hello')
loop = asyncio.get_event_loop()
# print hello ten years after this answer was written
loop.create_task(run_at(datetime.datetime(2028, 7, 11, 23, 36),
hello()))
loop.run_forever()