Rumah > pembangunan bahagian belakang > Tutorial Python > Bagaimanakah cara saya mengukur masa pelaksanaan tugasan Saderi?

Bagaimanakah cara saya mengukur masa pelaksanaan tugasan Saderi?

Barbara Streisand
Lepaskan: 2025-01-13 22:28:44
asal
880 orang telah melayarinya

How do I measure the execution time of Celery tasks?

Ahli baharu telah ditambahkan pada koleksi kod pendua: menjejaki masa pelaksanaan tugasan Saderi.

Setiap tugasan Saderi sebenarnya mempunyai dua masa "pelaksanaan" yang berbeza:

  • Masa pelaksanaan sebenar: Masa yang diambil untuk kod berjalan.
  • "Masa siap": Termasuk masa yang dihabiskan menunggu dalam baris gilir untuk proses pekerja yang tersedia.

Kedua-duanya penting kerana matlamat utama kami adalah untuk mengetahui bila tugasan selesai.

Selepas mencetuskan tugas, kita perlu tahu bila tugas itu selesai dan bila kita boleh mengharapkan hasilnya. Ia seperti anggaran projek. Apa yang pengurus benar-benar ingin tahu ialah bila projek itu akan siap, bukannya ia akan siap dalam seminggu tetapi tiada siapa yang akan mempunyai masa untuk melakukannya dalam tempoh enam bulan akan datang.

Gunakan Isyarat Saderi

Kami boleh menggunakan isyarat Saderi untuk masa tugasan.

Petua 1: Semua parameter isyarat Saderi ialah parameter kata kunci. Ini bermakna kita hanya boleh menyenaraikan hujah kata kunci yang kita minati dan membungkus selebihnya ke dalam **kwargs. Ini adalah reka bentuk yang hebat! Semua isyarat harus dilakukan dengan cara ini!

Petua 2: Kita boleh menyimpan masa mula dan tamat pelaksanaan dalam sifat "pengepala" objek tugasan.

Menyertai tugas

Apabila tugasan Saderi memasuki baris gilir, rekod masa semasa:

<code class="language-python">from celery import signals
from dateutil.parser import isoparse
from datetime import datetime, timezone

@signals.before_task_publish.connect
def before_task_publish(*, headers: dict, **kwargs):
    raw_eta = headers.get("eta")
    publish_time = isoparse(raw_eta) if raw_eta else datetime.now(tz=timezone.utc)
    headers["__publish_time"] = publish_time.isoformat()</code>
Salin selepas log masuk

Pelaksanaan tugas bermula

Apabila proses pekerja menerima tugas, rekod masa semasa:

<code class="language-python">from celery import signals
from datetime import datetime, timezone

@signals.task_prerun.connect
def task_prerun(*, task: Task, **kwargs):
    setattr(task.request, "__prerun_time", datetime.now(tz=timezone.utc).isoformat())</code>
Salin selepas log masuk

Pelaksanaan tugas telah tamat

Apabila tugasan selesai, kirakan masa pelaksanaan dan simpannya di suatu tempat, seperti StatsD atau alat pemantauan lain.

StatsD ialah tindanan teknologi standard industri untuk memantau aplikasi dan menginstrumen sebarang perisian untuk menyediakan metrik tersuai.

  • Netdata: Pengenalan StatsD [1]
<code class="language-python">from celery import signals, Task
from dateutil.parser import isoparse
from datetime import datetime, timezone, timedelta

def to_milliseconds(td: timedelta) -> int:
    return int(td.total_seconds() * 1000)

@signals.task_postrun.connect
def task_postrun(*, task: Task, **kwargs):
    now = datetime.now(tz=timezone.utc)
    publish_time = isoparse(getattr(task.request, "__publish_time", ""))
    prerun_time = isoparse(getattr(task.request, "__prerun_time", ""))

    exec_time = now - prerun_time if prerun_time else timedelta(0)
    waiting_time = prerun_time - publish_time if publish_time and prerun_time else timedelta(0)
    waiting_and_exec_time = now - publish_time if publish_time else timedelta(0)

    stats = {
        "exec_time_ms": to_milliseconds(exec_time),
        "waiting_time_ms": to_milliseconds(waiting_time),
        "waiting_and_exec_time_ms": to_milliseconds(waiting_and_exec_time),
    }
    # TODO: 将统计数据发送到 StatsD 或其他监控工具
    statsd.timing(f"celery.task.exec_time_ms", stats["exec_time_ms"], tags=[f"task:{task.name}"])
    # ... 发送其他统计数据 ...</code>
Salin selepas log masuk

Ciri tambahan: Tetapkan amaran masa pelaksanaan yang lama

Adalah mungkin untuk menambah ambang berkod keras dalam fungsi di atas:

<code class="language-python">if exec_time > timedelta(hours=1):
    logger.error(f"任务 {task.name} 执行时间过长: {exec_time}。请检查!")</code>
Salin selepas log masuk

Sebagai alternatif, seseorang boleh menetapkan ambang atau ambang berbilang peringkat berdasarkan definisi tugas, atau apa sahaja yang boleh dinyatakan dalam kod.

Atas ialah kandungan terperinci Bagaimanakah cara saya mengukur masa pelaksanaan tugasan Saderi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan