来自循环的Python调度程序cron作业不';我不能做所有不同的版本
我有一个函数,它每分钟从一个交换中获取并存储一些东西。我使用运行函数(通常非常好)。不幸的是,当我从循环中添加cron作业时,它似乎并不像我期望的那样工作 我有一个带有几个字符串的小列表,我想为其运行getAndStore函数。我可以这样做:来自循环的Python调度程序cron作业不';我不能做所有不同的版本,python,cron,apscheduler,Python,Cron,Apscheduler,我有一个函数,它每分钟从一个交换中获取并存储一些东西。我使用运行函数(通常非常好)。不幸的是,当我从循环中添加cron作业时,它似乎并不像我期望的那样工作 我有一个带有几个字符串的小列表,我想为其运行getAndStore函数。我可以这样做: from apscheduler.scheduler import Scheduler apsched = Scheduler() apsched.start() apsched.add_cron_job(lambda: getAndStore('A'),
from apscheduler.scheduler import Scheduler
apsched = Scheduler()
apsched.start()
apsched.add_cron_job(lambda: getAndStore('A'), minute='0-59')
apsched.add_cron_job(lambda: getAndStore('B'), minute='0-59')
apsched.add_cron_job(lambda: getAndStore('C'), minute='0-59')
这很好,但因为我是一名程序员,我喜欢自动化东西,所以我会这样做:
from apscheduler.scheduler import Scheduler
def getAndStore(apiCall):
# does a call to the api using apiCall as a value
# and stores it in the DB.
print apiCall
apiCalls = ['A', 'B', 'C']
apsched = Scheduler()
apsched.start()
for apiCall in apiCalls:
print 'Start cron for: ', apiCall
apsched.add_cron_job(lambda: getAndStore(apiCall), minute='0-59')
运行此操作时,输出如下所示:
Start cron for: A
Start cron for: B
Start cron for: C
C
C
C
奇怪的是,它似乎为A、B和C启动了cron,但实际上它为C启动了cron三次。这是ApsScheduler中的错误吗?还是我做错了什么
欢迎所有提示 这让我烦恼了一段时间,直到我终于明白了。因此,在潜行多年后,我创建了一个stackoverflow帐户。第一个帖子 尝试删除lambda(我知道…,我也这样做了),并将参数作为元组通过args传递。我在下面使用了一个稍微不同的调度器,但它应该很容易调整
from apscheduler.schedulers.background import BackgroundScheduler
import time
def getAndStore(apiCall):
# does a call to the api using apiCall as a value
# and stores it in the DB.
print(apiCall)
apiCalls = ['A', 'B', 'C']
apsched = BackgroundScheduler()
apsched.start()
for apiCall in apiCalls:
print ('Start cron for: ' + apiCall)
apsched.add_job(getAndStore, args=(apiCall,), trigger='interval', seconds=1)
# to test
while True:
time.sleep(2)
输出为:
Start cron for: A
Start cron for: B
Start cron for: C
B
A
C
这对我很有用:
for apiCall in apiCalls:
print 'Start cron for: ', apiCall
action = lambda x = apiCall: getAndStore(x)
apsched.add_cron_job(action , minute='0-59')
开设StackOverflow帐户的最佳理由!万分感谢!虽然这样做是可行的,但应该首选前面海报的答案,因为它不仅更简单,而且“args”参数也是出于这个特定的原因添加的。此外,它不能用于需要序列化的持久作业存储或执行器。