1

毎分取引所から何かを取得して保存する機能があります。(通常は優れた)APSchedulerを使用して関数を実行します。残念ながら、ループから 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 に対して開始するように見えますが、実際には C に対して cron を 3 回開始します。これは APScheduler のバグですか? それとも、ここで何か間違ったことをしていますか?

すべてのヒントは大歓迎です!

4

2 に答える 2

3

私が最終的にそれを理解するまで、これはしばらく私を悩ませました。そんなわけで、何年も潜んでいた後、stackoverflow アカウントを作成しました。初投稿!

ラムダをドロップしてみてください(私も知っています...、私もそのルートをたどりました)、 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
于 2015-03-12T16:12:39.030 に答える