1. المقدمة
أهمية المعالجة المتوازية في Python
تُستخدم لغة Python كلغة برمجة بسيطة وسهلة الاستخدام في مجموعة واسعة من التطبيقات. ومع ذلك، عند الحاجة إلى معالجة بيانات معقدة أو حسابات مكثفة، قد تصبح سرعة التنفيذ في Python تحديًا. لحل هذه المشكلة، تلعب “المعالجة المتوازية” دورًا مهمًا حيث تسمح بتنفيذ مهام متعددة في وقت واحد. في هذه المقالة، سنستعرض كيفية تنفيذ المعالجة المتوازية في Python، بدءًا من الأساليب الأساسية وصولًا إلى حالات الاستخدام العملية.
2. طرق المعالجة المتوازية في Python
الطرق الرئيسية للمعالجة المتوازية
تحتوي Python على عدة طرق لتحقيق المعالجة المتوازية، وأهمها ما يلي:
- المعالجات المتعددة (
threading
module)
يتم استخدام عدة خيوط (Threads) لتنفيذ المهام بشكل متزامن، ولكن بسبب آليةGIL
(Global Interpreter Lock) في Python، فإن فائدتها محدودة في المهام التي تستهلك وحدة المعالجة المركزية بكثافة. - المعالجات المتعددة (
multiprocessing
module)
كل عملية تعمل في مساحة ذاكرة مستقلة، وبالتالي لا تتأثر بـ GIL، مما يسمح بمعالجة متوازية حقيقية. هذا مناسب للمهام الثقيلة مثل معالجة البيانات الكبيرة والحسابات المعقدة. - المعالجة غير المتزامنة (
asyncio
module)
المعالجة غير المتزامنة فعّالة بشكل خاص في المهام المعتمدة على الإدخال/الإخراج (مثل الاتصالات الشبكية أو عمليات الملفات). تتيح معالجة المهام ذات أوقات الانتظار الطويلة بكفاءة.

3. تعدد العمليات مقابل تعدد الخيوط
تأثير GIL (Global Interpreter Lock)
تحتوي Python على آلية تُعرف بـ GIL، والتي تتيح تنفيذ خيط واحد فقط في نفس الوقت. لذلك، في المهام المعتمدة على المعالج (CPU-bound)، لن يؤدي زيادة عدد الخيوط إلى تحسين الأداء. ولهذا فإن استخدام الخيوط مناسب فقط للمهام التي تحتوي على وقت انتظار طويل مثل المهام المعتمدة على الإدخال/الإخراج.
مزايا وحدود تعدد الخيوط
الخيوط خفيفة الوزن ومناسبة للمهام المعتمدة على الإدخال/الإخراج مثل عمليات الملفات أو الشبكات. لكن بسبب GIL، لا يمكن استغلال جميع أنوية المعالج بشكل كامل، مما يجعلها غير مناسبة للمهام المعتمدة على وحدة المعالجة المركزية.
“`python
import threading
import time
def worker(num):
print(f”Worker {num} starting”)
time.sleep(2)
print(f”Worker {num} finished”)
threads = []
for i in range(5):
t = threading.Thread(target=worker, args=(i,))
threads.append(t)
t.start()
for t in threads:
t.join()
“`
مزايا تعدد العمليات
لتجاوز قيود GIL، يعتبر تعدد العمليات أكثر فعالية. حيث تعمل العمليات في ذاكرة مستقلة وتستطيع الاستفادة الكاملة من أنوية المعالج المتعددة. وهذا يُعتبر مثاليًا للحسابات المكثفة أو معالجة البيانات الكبيرة.
“`python
from multiprocessing import Process
import time
def worker(num):
print(f”Worker {num} starting”)
time.sleep(2)
print(f”Worker {num} finished”)
if __name__ == ‘__main__’:
processes = []
for i in range(5):
p = Process(target=worker, args=(i,))
processes.append(p)
p.start()
for p in processes:
p.join()
“`
4. تنفيذ المعالجة المتوازية في Python
المعالجة باستخدام مكتبة multiprocessing
باستخدام مكتبة multiprocessing
يمكن إدارة عدة عمليات بكفاءة. المثال التالي يوضح كيفية استخدام Pool لمعالجة قائمة من المهام بشكل متوازي:
“`python
from multiprocessing import Pool
def square(x):
return x * x
if __name__ == ‘__main__’:
with Pool(4) as p:
result = p.map(square, [1, 2, 3, 4, 5])
print(result)
“`
5. المعالجة غير المتزامنة واستخداماتها
المعالجة باستخدام asyncio
asyncio
مناسب للمهام التي تتضمن أوقات انتظار مثل الشبكات أو إدخال/إخراج الملفات.
“`python
import asyncio
async def worker(num):
print(f’Worker {num} starting’)
await asyncio.sleep(1)
print(f’Worker {num} finished’)
async def main():
tasks = [worker(i) for i in range(5)]
await asyncio.gather(*tasks)
asyncio.run(main())
“`

6. تحسين الأداء باستخدام Joblib
التوازي مع Joblib
Joblib
مكتبة مفيدة لتسريع الحسابات الثقيلة مثل معالجة البيانات أو تدريب نماذج التعلم الآلي.
“`python
from joblib import Parallel, delayed
def heavy_task(n):
return n ** 2
results = Parallel(n_jobs=4)(delayed(heavy_task)(i) for i in range(10))
print(results)
“`
7. التطبيقات العملية للمعالجة المتوازية في Python
معالجة البيانات و Web Scraping
المعالجة المتوازية في Python فعّالة بشكل خاص في التعامل مع البيانات الكبيرة أو تنفيذ طلبات متعددة في وقت واحد مثل Web Scraping. كما تُستخدم أيضًا في تدريب نماذج التعلم الآلي ومعالجة البيانات الأولية.
8. الخلاصة
المعالجة المتوازية تقنية أساسية لتحسين أداء Python. باستخدام مكتبات مثل threading
، multiprocessing
، asyncio
، و Joblib
يمكن تسريع تنفيذ المهام وزيادة الكفاءة في مختلف التطبيقات.