Ahli baharu telah ditambahkan pada koleksi kod pendua: menjejaki masa pelaksanaan tugasan Saderi.
Setiap tugasan Saderi sebenarnya mempunyai dua masa "pelaksanaan" yang berbeza:
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.
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.
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>
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>
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.
<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>
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>
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!