0

Python APSchedulerを使用して一連の繰り返しタスクを実行していますが、いくつかのタスクで次のようなエラーが発生します。

WARNING:apscheduler.scheduler:Execution of job "getAndStoreExchangeRate (trigger: cron[minute='*'], next run at: 2014-11-06 18:48:00 CET)" skipped: 実行中のインスタンスの最大数に達しました (1 )

それに加えて、この APscheduler インスタンスのメモリ使用量は、約 10 日間の実行で約 47MiB から 1200MiB に急激に増加し、その後、マシンがメモリ不足であらゆるプロセスが停止します。

したがって、問題の根本にたどり着くには、これらの警告の原因となっている呼び出しを正確に理解する必要があります。私の知る限り、このエラーは、前の呼び出し (この呼び出しの 1 分前) がまだ終了していないために発生します。ただし、このエラーの情報はかなりあいまいです。関数の名前は ( getAndStoreExchangeRate) で示されていますが、このような名前の関数を含む複数のファイルがあります。だから私が知りたいのは:

  • 警告が発生するこの関数は、どのファイルのどの行にありますか?
  • この関数に与えられた引数は?

この情報をどこかに記録する方法を知っている人はいますか? すべてのヒントは大歓迎です!

[編集]

そこで、BackgroundScheduler をサブクラス化し_process_jobs()、このスニペットで self._logger.warning を変更したメソッドを上書きしました。

try:
    executor.submit_job(job, run_times)
except MaxInstancesReachedError:
    self._logger.warning(
        'Execution of job "%s" skipped: maximum number of running instances reached (%d)',
        job, job.max_instances
    )
except:
    self._logger.exception('Error submitting job "%s" to executor "%s"', job, job.executor)

これに:

'Execution of job "%s" skipped: maximum number of running instances reached (%d) =-= ARGS: ' + str(job.args) + ' - KWARGS: ' + str(job.kwargs),

これは、関数に与えられた引数を表示するという点で機能しますが、最も重要なことはまだわかりません。警告が発生するこの関数がどのファイルのどの行に定義されているかです。誰か私がそれを示す方法を知っていますか?

4

1 に答える 1

2

最も簡単な方法は、_process_jobs() メソッドの apscheduler.schedulers.base モジュールの「except MaxInstancesReachedError:」ブロックに追加のログ ステートメントを追加することです。そこで、ジョブのターゲット関数である job.func にアクセスできます。

選択したスケジューラをサブクラス化し、_process_jobs メソッド コードをコピーすることをお勧めします。次に、MaxInstancesReachedError 以外のブロックを変更します。

try:
    executor.submit_job(job, run_times)
except MaxInstancesReachedError:
    self._logger.warning('Execution of job "%s" skipped: maximum number of running instances reached (%d)', job.func, job.max_instances)

編集:

関数のファイル名: job.func.__code__.co_filename

行番号: job.func.__code__.co_firstlineno

于 2014-12-03T17:36:30.227 に答える