如何安排任务在asyncio中使其在特定日期运行?

时间:2018-07-11 18:23:43

标签: python scheduled-tasks python-asyncio

我的程序应该运行24/7,我希望能够在某个小时/日期运行某些任务。

我已经尝试使用aiocron,但是它仅支持调度功能(不支持协程),并且我读到它并不是一个很好的库。 我的程序是构建的,因此,即使不是我要调度的所有任务,大多数也是在协程中构建的。

是否还有其他库可以进行此类任务调度?

或者,如果不这样做,可以使协程变形以使它们运行正常功能吗?

1 个答案:

答案 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()