Python 3.9-使用不同参数安排异步函数的周期调用

Python 3.9-使用不同参数安排异步函数的周期调用,python,python-3.x,scheduled-tasks,python-asyncio,Python,Python 3.x,Scheduled Tasks,Python Asyncio,在Python3.9中,如何实现按预定周期使用不同参数调用异步函数的功能?该功能应能在任何操作系统(Linux、Windows、Mac)上运行 我有一个从交易所下载市场数据的函数fetchOHLCV。该函数有两个输入参数-pair、timeframe。 根据对和时间范围值,函数从交换机下载数据并将其存储在DB中 目标-使用具有不同参数的不同时段调用此函数 1) fetchOHLCV(pair ='EUR/USD', timeframe="1m") - each minute

在Python3.9中,如何实现按预定周期使用不同参数调用异步函数的功能?该功能应能在任何操作系统(Linux、Windows、Mac)上运行

我有一个从交易所下载市场数据的函数fetchOHLCV。该函数有两个输入参数-pair、timeframe。 根据对和时间范围值,函数从交换机下载数据并将其存储在DB中

目标-使用具有不同参数的不同时段调用此函数

1) fetchOHLCV(pair ='EUR/USD', timeframe="1m") - each minute
2) fetchOHLCV(pair ='EUR/USD', timeframe="1h") - each new hour.
3) fetchOHLCV(pair ='EUR/USD', timeframe="1d") - each new day 
4) fetchOHLCV(pair ='EUR/USD', timeframe="1w") - each new week
目前,我还没有使用python进行调度的经验,也不知道哪些库最适合我的任务,我对实现类似任务的最佳实践很感兴趣。

这里使用的AsyncIOScheduler可以自然地与异步函数一起工作

scheduler = AsyncIOScheduler()
scheduler.add_job(fetchOHLCV, trigger=tr)
scheduler.start()
tr是触发器对象。您可以使用
IntervalTrigger
CronTrigger
来安排它。建议在程序结束后对调度程序对象执行
shutdown()

或者

您可以使用来计划到事件循环的协同路由

asyncio.run_coroutine_threadsafe(async_function(), bot.loop)
Python3.9

import asyncio

async def periodic():
    while True:
        print('periodic')
        await asyncio.sleep(1) #you can put 900 seconds = 15mins

def stop():
    task.cancel()

loop = asyncio.get_event_loop()
loop.call_later(5, stop) #increase end time as per your requirement
task = loop.create_task(periodic())

try:
    loop.run_until_complete(task)
except asyncio.CancelledError:
    pass


如您所见,异步函数是在
1秒
的调度下调用的,而
stop
函数是在
5秒
时调用的。尝试实现这一点,并可能解决您的问题

作为一个现成的解决方案,您可以使用库。如果您不熟悉表达式语法,可以使用联机编辑器进行检查

示例(这适用于任何操作系统):

输出:

15:26:00.003226 At every minute
15:27:00.002642 At every minute
...

asyncio的上一次更新是两年前。这是一个活生生的项目吗?它是否与python 3.9兼容,以及新的asyncio库?
asyncio
在python 3.9中没有显著变化,并且这个示例与它完全兼容干净漂亮的代码。不清楚如何添加每15分钟调用一次异步函数的作业。例如XX:00:00、XX:15:00、XX:30:00、XX:45:00。你能举个例子吗?而且库不应该使用任何数据库进行存储配置。我已经用
python3.9
上的一个工作示例更新了我的答案。尝试以这种方式实现
15:26:00.003226 At every minute
15:27:00.002642 At every minute
...