مراقبة مهمة أو إلغاؤها
اطّلع على قائمة أحمال عملك في صفحة Workloads.
عرض حالة المهمة
انتقل إلى جدول Workloads وتحقق من عمود Status لمعرفة ما إذا كانت المهمة قد اكتملت أو فشلت.
عرض الاستخدام المتبقي
انتقل إلى جدول Instances واختر التبويب المرتبط بالخطة التي تريد معرفة استخدامها المتبقي. سيظهر لك إجمالي الوقت المُستخدَم والوقت المتبقي في خطتك.
عرض مقاييس عدد المهام وأحمال العمل المُرسَلة
انتقل إلى صفحة Analytics لترى الإجمالي الكلي للمهام المُرسَلة، إضافةً إلى عدد أحمال عمل الدُّفعات (batch) وأحمال عمل الجلسات (session). لاحظ أنك لا تستطيع الاطلاع على صفحة Analytics إلا للحسابات التي تمتلكها أو تديرها.
مراقبة مهمة
استخدم نسخة المهمة (job instance) للتحقق من حالتها أو استرداد نتائجها عبر استدعاء الأمر المناسب:
| job.result() | اعرض نتائج المهمة فور اكتمالها. تتوفر النتائج بعد انتهاء المهمة، لذا فإن job.result() استدعاءٌ محجوب (blocking call) حتى تكتمل المهمة. |
| job.job_id() | أعِد المعرّف الفريد للمهمة. استرداد النتائج لاحقاً يستلزم معرفة هذا المعرّف، لذا يُنصح بحفظ معرّفات المهام التي قد تحتاج إلى استردادها لاحقاً. |
| job.status() | تحقق من حالة المهمة. |
| job = service.job(<job_id>) | استرجع مهمة سبق أن أرسلتها. يستلزم هذا الاستدعاء معرّف المهمة. |
استرداد نتائج المهمة في وقت لاحق
استدعِ service.job(\<job\_id>) لاسترداد مهمة أرسلتها سابقاً. إن لم يكن لديك معرّف المهمة، أو أردت استرداد عدة مهام دفعةً واحدة — بما في ذلك المهام من وحدات المعالجة الكمية (QPUs) المُتقاعَدة — فاستخدم service.jobs() مع مرشّحات اختيارية. راجع QiskitRuntimeService.jobs.
تُعيد service.jobs() أيضاً المهام التي نُفِّذت من حزمة qiskit-ibm-provider المُهمَلة. أما المهام التي أُرسلت عبر الحزمة الأقدم (المُهمَلة أيضاً) qiskit-ibmq-provider فلم تعد متاحة.
مثال
يُعيد هذا المثال أحدث 10 مهام runtime نُفِّذت على my_backend:
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-ibm-runtime
# This cell is hidden from users
from qiskit import QuantumCircuit
from qiskit.circuit import Parameter
from qiskit.transpiler import generate_preset_pass_manager
from qiskit_ibm_runtime import QiskitRuntimeService, SamplerV2
import numpy as np
my_backend = "ibm_torino"
service = QiskitRuntimeService()
# backend = service.backend(my_backend)
backend = service.least_busy()
# Define two circuits, each with one parameter with two parameters.
circuit = QuantumCircuit(2)
circuit.h(0)
circuit.cx(0, 1)
circuit.ry(Parameter("a"), 0)
circuit.cx(0, 1)
circuit.h(0)
circuit.measure_all()
pm = generate_preset_pass_manager(optimization_level=1, backend=backend)
transpiled_circuit = pm.run(circuit)
params = np.random.uniform(size=(2, 3)).T
sampler_pub = (transpiled_circuit, params)
# Instantiate the new estimator object, then run the transpiled circuit
# using the set of parameters and observables.
sampler = SamplerV2(mode=backend)
job = sampler.run([sampler_pub], shots=4)
print(job.job_id())
d305ck0ocacs73ajagvg
result = job.result()
spans = job.result().metadata["execution"]["execution_spans"]
print(spans)
ExecutionSpans([DoubleSliceSpan(<start='2025-09-09 16:31:16', stop='2025-09-09 16:31:16', size=24>)])
params = np.random.uniform(size=(2, 3))
params
array([[0.2260416 , 0.8747859 , 0.44361995],
[0.94700856, 0.96826017, 0.98426562]])
mask = spans[0].mask(0)
mask
array([[[ True, True, True, True],
[ True, True, True, True]],
[[ True, True, True, True],
[ True, True, True, True]],
[[ True, True, True, True],
[ True, True, True, True]]])
from qiskit_ibm_runtime import QiskitRuntimeService
# Initialize the account first.
service = QiskitRuntimeService()
# Use `limit` to retrieve a specific number of jobs. The default `limit` is 10.
service.jobs(backend_name=my_backend)
إلغاء مهمة
يمكنك إلغاء مهمة من لوحة تحكم IBM Quantum Platform إما من صفحة Workloads أو من صفحة التفاصيل لحمل عمل محدد. في صفحة Workloads، انقر على قائمة الفائض (overflow menu) في نهاية صف حمل العمل واختر Cancel. أما إذا كنت في صفحة التفاصيل لحمل عمل محدد، فاستخدم القائمة المنسدلة Actions في أعلى الصفحة واختر Cancel.
في Qiskit، استخدم job.cancel() لإلغاء مهمة.
عرض نطاقات تنفيذ Sampler
تحتوي نتائج مهام SamplerV2 المُنفَّذة في Qiskit Runtime على معلومات توقيت التنفيذ ضمن بياناتها الوصفية (metadata).
يمكن استخدام هذه المعلومات لتحديد حدود زمنية عليا ودنيا لوقت تنفيذ لقطات (shots) معينة على وحدة المعالجة الكمية (QPU).
تُجمَّع اللقطات في كائنات ExecutionSpan، يُحدد كل منها وقت بدء وانتهاء، إضافةً إلى تفاصيل اللقطات التي جُمعت خلال ذلك النطاق.
يُحدد نطاق التنفيذ البيانات التي نُفِّذت خلال نافذته عبر توفير طريقة ExecutionSpan.mask. تُعيد هذه الطريقة، بالنسبة لأي فهرس Primitive Unified Block (PUB)، قناعاً (mask) منطقياً يكون True لجميع اللقطات المُنفَّذة خلال تلك النافذة. تُفهرَس وحدات PUB وفق الترتيب الذي أُعطيت به لاستدعاء Sampler run. فمثلاً، إذا كانت لوحدة PUB شكل (2, 3) ونُفِّذت بأربع لقطات، فإن شكل القناع يكون (2, 3, 4). راجع صفحة API الخاصة بـ execution_span للاطلاع على التفاصيل ال كاملة.
مثال:
لعرض معلومات نطاق التنفيذ، راجع البيانات الوصفية للنتيجة التي يُعيدها SamplerV2، والتي تأتي في شكل كائن ExecutionSpans. هذا الكائن عبارة عن حاوية شبيهة بالقائمة تحتوي على نسخ من الفئات الفرعية لـ ExecutionSpan، مثل SliceSpan:
from qiskit.primitives import BitArray
# Get the mask of the 1st PUB for the 0th span.
mask = spans[0].mask(0)
# Decide whether the 0th shot of parameter set (1, 2) occurred in this span.
in_this_span = mask[2, 1, 0]
# Create a new bit array containing only the PUB-1 data collected during this span.
bits = result[0].data.meas
filtered_data = BitArray(bits.array[mask], bits.num_bits)
يمكن تصفية نطاقات التنفيذ لتشمل فقط المعلومات المتعلقة بوحدات PUB محددة، مُختارةً بحسب فهارسها:
# take the subset of spans that reference data in PUBs 0 or 2
spans.filter_by_pub([0, 2])
ExecutionSpans([DoubleSliceSpan(<start='2025-09-09 16:31:16', stop='2025-09-09 16:31:16', size=24>)])
اعرض معلومات عامة عن مجموعة نطاقات التنفيذ:
print("Number of execution spans:", len(spans))
print(" Start of the first span:", spans.start)
print(" End of the last span:", spans.stop)
print(" Total duration (s):", spans.duration)
Number of execution spans: 1
Start of the first span: 2025-09-09 16:31:16.320568
End of the last span: 2025-09-09 16:31:16.865858
Total duration (s): 0.54529
استخرج نطاقاً معيناً وافحصه:
spans.sort()
print(" Start of first span:", spans[0].start)
print(" End of first span:", spans[0].stop)
print("#shots in first span:", spans[0].size)
Start of first span: 2025-09-09 16:31:16.320568
End of first span: 2025-09-09 16:31:16.865858
#shots in first span: 24
من المحتمل أن تتداخل النوافذ الزمنية التي تُحددها نطاقات تنفيذ مختلفة. لا يعني ذلك أن وحدة المعالجة الكمية كانت تُنفِّذ عمليات متعددة في آنٍ واحد، بل هو أثرٌ جانبي لبعض المعالجة الكلاسيكية التي قد تحدث بالتوازي مع التنفيذ الكمي. الضمان المُقدَّم هو أن البيانات المُشار إليها قد وقعت بالفعل ضمن نطاق التنفيذ المُبلَّغ عنه، وليس بالضرورة أن حدود النافذة الزمنية هي أدق حدود ممكنة.
الخطوات التالية
- جرّب درس خوارزمية Grover.