9

実行する作業をディスパッチするためにセロリを使用するように、スタンドアロンのバッチ ジョブを変換しました。私はRabbitMQを使用しています。すべてが単一のマシンで実行されており、RabbitMQ インスタンスを使用している他のプロセスはありません。私のスクリプトは、ワーカーによって処理される一連のタスクを作成するだけです。

スクリプトの開始からすべてのタスクが完了するまでの時間を測定する簡単な方法はありますか? メッセージキューを使用する場合、これは設計上少し複雑であることを私は知っています。しかし、テストしてパフォーマンスの見積もりを取得するためだけに、本番環境で実行したくありません。

4

2 に答える 2

33

セロリ信号を使用できます。登録された関数は、タスクが実行される前後に呼び出されます。経過時間を測定するのは簡単です。

from time import time
from celery.signals import task_prerun, task_postrun


d = {}

@task_prerun.connect
def task_prerun_handler(signal, sender, task_id, task, args, kwargs, **extras):
    d[task_id] = time()


@task_postrun.connect
def task_postrun_handler(signal, sender, task_id, task, args, kwargs, retval, state, **extras):
    try:
        cost = time() - d.pop(task_id)
    except KeyError:
        cost = -1
    print task.__name__, cost
于 2015-07-30T18:40:46.873 に答える
8

タスクが送信された時刻を渡す偽のタスクを最後に追加することで、和音を使用できます。これは、現在の時刻と実行された時刻の差を返します。

import celery
import datetime
from celery import chord

@celery.task
def dummy_task(res=None, start_time=None):
    print datetime.datetime.now() - start_time

def send_my_task():
    chord(my_task.s(), dummy_task.s(start_time=datetime.datetime.now()).delay()

send_my_taskプロファイリングするタスクを送信し、dummy_taskそれにかかった時間 (多かれ少なかれ) を出力します。より正確な数値が必要な場合は、start_time を直接タスクに渡し、シグナルを使用することをお勧めします。

于 2013-10-20T19:06:40.713 に答える