معالجة متوازية في Python: الدليل الشامل لاستخدام multiprocessing و asyncio لتحسين الأداء

1. المقدمة

أهمية المعالجة المتوازية في Python

تُستخدم لغة Python كلغة برمجة بسيطة وسهلة الاستخدام في مجموعة واسعة من التطبيقات. ومع ذلك، عند الحاجة إلى معالجة بيانات معقدة أو حسابات مكثفة، قد تصبح سرعة التنفيذ في Python تحديًا. لحل هذه المشكلة، تلعب “المعالجة المتوازية” دورًا مهمًا حيث تسمح بتنفيذ مهام متعددة في وقت واحد. في هذه المقالة، سنستعرض كيفية تنفيذ المعالجة المتوازية في Python، بدءًا من الأساليب الأساسية وصولًا إلى حالات الاستخدام العملية.

2. طرق المعالجة المتوازية في Python

الطرق الرئيسية للمعالجة المتوازية

تحتوي Python على عدة طرق لتحقيق المعالجة المتوازية، وأهمها ما يلي:

  1. المعالجات المتعددة (threading module)
    يتم استخدام عدة خيوط (Threads) لتنفيذ المهام بشكل متزامن، ولكن بسبب آلية GIL (Global Interpreter Lock) في Python، فإن فائدتها محدودة في المهام التي تستهلك وحدة المعالجة المركزية بكثافة.
  2. المعالجات المتعددة (multiprocessing module)
    كل عملية تعمل في مساحة ذاكرة مستقلة، وبالتالي لا تتأثر بـ GIL، مما يسمح بمعالجة متوازية حقيقية. هذا مناسب للمهام الثقيلة مثل معالجة البيانات الكبيرة والحسابات المعقدة.
  3. المعالجة غير المتزامنة (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)
“`

RUNTEQ(ランテック)|超実戦型エンジニア育成スクール

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 يمكن تسريع تنفيذ المهام وزيادة الكفاءة في مختلف التطبيقات.