来自循环的Python调度程序cron作业不';我不能做所有不同的版本

来自循环的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'),

我有一个函数,它每分钟从一个交换中获取并存储一些东西。我使用运行函数(通常非常好)。不幸的是,当我从循环中添加cron作业时,它似乎并不像我期望的那样工作

我有一个带有几个字符串的小列表,我想为其运行getAndStore函数。我可以这样做:

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”参数也是出于这个特定的原因添加的。此外,它不能用于需要序列化的持久作业存储或执行器。