فهم قوائم الانتظار في بايثون
قوائم الانتظار (Queues) هي واحدة من هياكل البيانات الأساسية التي تُستخدم لإدارة البيانات بطريقة منظمة. تتميز قوائم الانتظار بأنها تعمل وفقاً لمبدأ “أول من يدخل هو أول من يخرج” (First-In-First-Out – FIFO)، مما يعني أن العنصر الذي يُضاف أولاً هو الذي يُزال أولاً. في بايثون، يمكن تنفيذ قوائم الانتظار باستخدام عدة طرق، منها استخدام القوائم المدمجة أو مكتبة `collections` أو مكتبة `queue`.
أبسط طريقة لتمثيل قائمة انتظار في بايثون هي استخدام القوائم المدمجة. يمكنك إضافة عناصر إلى نهاية القائمة باستخدام `append()` وإزالة العناصر من بداية القائمة باستخدام `pop(0)`. على الرغم من بساطة هذه الطريقة، إلا أنها ليست الأكثر كفاءة لأن إزالة العناصر من مقدمة القائمة يتطلب تحريك جميع العناصر الأخرى.
استخدام مكتبة collections لتنفيذ قوائم الانتظار
تعتبر مكتبة `collections` من المكتبات المفيدة في بايثون التي توفر العديد من الهياكل المتقدمة، بما في ذلك `deque` التي تُعتبر الأمثل لتنفيذ قوائم الانتظار. يتيح لك `deque` إضافة وإزالة العناصر بكفاءة من كلا الطرفين، مما يجعله خياراً ممتازاً لقوائم الانتظار.
إليك مثال يوضح كيفية استخدام `deque` لتنفيذ قائمة انتظار:
from collections import deque
# إنشاء قائمة انتظار
queue = deque()
# إضافة عناصر إلى قائمة الانتظار
queue.append('A')
queue.append('B')
queue.append('C')
print("قائمة الانتظار الحالية:", list(queue))
# إزالة عنصر من قائمة الانتظار
queue.popleft()
print("قائمة الانتظار بعد إزالة عنصر:", list(queue))
في هذا المثال، نقوم بإضافة العناصر ‘A’ و ‘B’ و ‘C’ إلى قائمة الانتظار باستخدام `append()`، ثم نزيل العنصر الأول باستخدام `popleft()`. يتيح لنا `deque` تنفيذ هذه العمليات بكفاءة عالية دون الحاجة إلى تحريك العناصر كما هو الحال في القوائم المدمجة.
استخدام مكتبة queue لقوائم الانتظار المتزامنة
تُستخدم مكتبة `queue` بشكل أساسي في برمجة التطبيقات المتوازية حيث يكون الوصول المتزامن إلى قائمة الانتظار ضرورياً. توفر المكتبة عدة أنواع من قوائم الانتظار مثل `Queue` و `LifoQueue` و `PriorityQueue`، وكل منها مصمم لغرض محدد.
إليك مثال على استخدام `Queue` من مكتبة `queue`:
from queue import Queue
# إنشاء قائمة انتظار
q = Queue()
# إضافة عناصر إلى قائمة الانتظار
q.put('X')
q.put('Y')
q.put('Z')
print("حجم قائمة الانتظار:", q.qsize())
# إزالة عنصر من قائمة الانتظار
removed_item = q.get()
print("العنصر الذي تمت إزالته:", removed_item)
print("حجم قائمة الانتظار بعد الإزالة:", q.qsize())
في هذا المثال، نقوم بإضافة العناصر ‘X’ و ‘Y’ و ‘Z’ إلى قائمة الانتظار باستخدام `put()`، ثم نزيل العنصر الأول باستخدام `get()`. تعتبر `Queue` من مكتبة `queue` خياراً ممتازاً عند التعامل مع التطبيقات المتوازية، حيث تدير المزامنة بشكل تلقائي.
