استخدم هذه التقنيات لتشغيل التعليمات البرمجية في وقت واحد وتوفير تجربة مستخدم أكثر سلاسة.

الماخذ الرئيسية

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

التزامن والتوازي هما تقنيتان تتيحان لك تشغيل عدة برامج في وقت واحد. لدى بايثون خيارات متعددة للتعامل مع المهام بشكل متزامن ومتوازي، الأمر الذي قد يكون مربكًا.

استكشف الأدوات والمكتبات المتاحة لتنفيذ التزامن والتوازي بشكل صحيح في بايثون، وأوجه الاختلاف بينهما.

فهم التزامن والتوازي

يشير التزامن والتوازي إلى مبدأين أساسيين لتنفيذ المهام في الحوسبة. ولكل منها خصائصها المميزة.

  1. التزامن هي قدرة البرنامج على إدارة مهام متعددة في نفس الوقت دون الحاجة إلى تنفيذها في نفس الوقت. تدور حول فكرة تشذير المهام، والتبديل بينها بطريقة تبدو متزامنة.
  2. instagram viewer
  3. تماثلومن ناحية أخرى، يتضمن تنفيذ مهام متعددة بالتوازي. وعادة ما يتم الاستفادة من نوى أو معالجات وحدة المعالجة المركزية المتعددة. يحقق التوازي تنفيذًا متزامنًا حقيقيًا، مما يتيح لك تنفيذ المهام بشكل أسرع، وهو مناسب تمامًا للعمليات الحسابية المكثفة.

أهمية التزامن والتوازي

لا يمكن المبالغة في التأكيد على الحاجة إلى التزامن والتوازي في الحوسبة. إليك سبب أهمية هذه التقنيات:

  1. استغلال الموارد: يسمح التزامن بالاستخدام الفعال لموارد النظام، مما يضمن أن المهام تحرز تقدمًا نشطًا بدلاً من الانتظار دون جدوى للموارد الخارجية.
  2. إستجابة: يمكن أن يؤدي التزامن إلى تحسين استجابة التطبيقات، خاصة في السيناريوهات التي تتضمن واجهات المستخدم أو خوادم الويب.
  3. أداء: يعد التوازي أمرًا بالغ الأهمية لتحقيق الأداء الأمثل، خاصة في المهام المرتبطة بوحدة المعالجة المركزية مثل الحسابات المعقدة ومعالجة البيانات وعمليات المحاكاة.
  4. قابلية التوسع: يعد كل من التزامن والتوازي ضروريين لبناء أنظمة قابلة للتطوير.
  5. إثبات المستقبل: مع استمرار اتجاهات الأجهزة في تفضيل المعالجات متعددة النواة، ستصبح القدرة على تسخير التوازي ضرورية بشكل متزايد.

التزامن في بايثون

يمكنك تحقيق التزامن في Python باستخدام الترابط والبرمجة غير المتزامنة مع مكتبة غير متزامنة.

الخيوط في بايثون

الترابط عبارة عن آلية متزامنة في Python تتيح لك إنشاء المهام وإدارتها ضمن عملية واحدة. المواضيع مناسبة لأنواع معينة من المهام، خاصة تلك المرتبطة بالإدخال/الإخراج ويمكن أن تستفيد من التنفيذ المتزامن.

بايثون خيوط وحدة يوفر واجهة عالية المستوى لإنشاء وإدارة المواضيع. في حين أن GIL (قفل المترجم العالمي) يحد من سلاسل الرسائل من حيث التوازي الحقيقي، إلا أنه لا يزال بإمكانها تحقيق التزامن من خلال تشذير المهام بكفاءة.

يوضح الكود أدناه مثالاً لتطبيق التزامن باستخدام سلاسل الرسائل. يستخدم مكتبة طلبات Python لإرسال طلب HTTP، وهي مهمة حظر الإدخال/الإخراج الشائعة. كما يستخدم وحدة الوقت لحساب وقت التنفيذ.

import requests
import time
import threading

urls = [
'https://www.google.com',
'https://www.wikipedia.org',
'https://www.makeuseof.com',
]

# function to request a URL
defdownload_url(url):
response = requests.get(url)
print(f"Downloaded {url} - Status Code: {response.status_code}")

# Execute without threads and measure execution time
start_time = time.time()

for url in urls:
download_url(url)

end_time = time.time()
print(f"Sequential download took {end_time - start_time:.2f} seconds\n")

# Execute with threads, resetting the time to measure new execution time
start_time = time.time()
threads = []

for url in urls:
thread = threading.Thread(target=download_url, args=(url,))
thread.start()
threads.append(thread)

# Wait for all threads to complete
for thread in threads:
thread.join()

end_time = time.time()
print(f"Threaded download took {end_time - start_time:.2f} seconds")

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

البرمجة غير المتزامنة مع Asyncio

غير متزامن يوفر حلقة حدث تدير المهام غير المتزامنة التي تسمى coroutines. Coroutines هي وظائف يمكنك إيقافها مؤقتًا واستئنافها، مما يجعلها مثالية للمهام المرتبطة بالإدخال/الإخراج. تعتبر المكتبة مفيدة بشكل خاص للسيناريوهات التي تتضمن فيها المهام انتظار الموارد الخارجية، مثل طلبات الشبكة.

يمكنك تعديل مثال إرسال الطلب السابق للعمل معه غير متزامن:

import asyncio
import aiohttp
import time

urls = [
'https://www.google.com',
'https://www.wikipedia.org',
'https://www.makeuseof.com',
]

# asynchronous function to request URL
asyncdefdownload_url(url):
asyncwith aiohttp.ClientSession() as session:
asyncwith session.get(url) as response:
content = await response.text()
print(f"Downloaded {url} - Status Code: {response.status}")

# Main asynchronous function
asyncdefmain():
# Create a list of tasks to download each URL concurrently
tasks = [download_url(url) for url in urls]

# Gather and execute the tasks concurrently
await asyncio.gather(*tasks)

start_time = time.time()

# Run the main asynchronous function
asyncio.run(main())

end_time = time.time()

print(f"Asyncio download took {end_time - start_time:.2f} seconds")

باستخدام الكود، يمكنك تنزيل صفحات الويب بشكل متزامن باستخدام غير متزامن والاستفادة من عمليات الإدخال/الإخراج غير المتزامنة. يمكن أن يكون هذا أكثر كفاءة من الترابط للمهام المرتبطة بالإدخال/الإخراج.

التوازي في بايثون

يمكنك تنفيذ التوازي باستخدام بايثون معالجة متعددة وحدة، والذي يسمح لك بالاستفادة الكاملة من المعالجات متعددة النواة.

المعالجة المتعددة في بايثون

بايثون معالجة متعددة توفر الوحدة طريقة لتحقيق التوازي من خلال إنشاء عمليات منفصلة، ​​لكل منها مترجم بايثون الخاص بها ومساحة الذاكرة. يؤدي هذا إلى تجاوز قفل المترجم العالمي (GIL) بشكل فعال، مما يجعله مناسبًا للمهام المرتبطة بوحدة المعالجة المركزية.

import requests
import multiprocessing
import time

urls = [
'https://www.google.com',
'https://www.wikipedia.org',
'https://www.makeuseof.com',
]

# function to request a URL
defdownload_url(url):
response = requests.get(url)
print(f"Downloaded {url} - Status Code: {response.status_code}")

defmain():
# Create a multiprocessing pool with a specified number of processes
num_processes = len(urls)
pool = multiprocessing.Pool(processes=num_processes)

start_time = time.time()
pool.map(download_url, urls)
end_time = time.time()

# Close the pool and wait for all processes to finish
pool.close()
pool.join()

print(f"Multiprocessing download took {end_time-start_time:.2f} seconds")

main()

في هذا المثال، معالجة متعددة يولد عمليات متعددة، مما يسمح ل download_url وظيفة تعمل بالتوازي.

متى يتم استخدام التزامن أو التوازي

يعتمد الاختيار بين التزامن والتوازي على طبيعة مهامك وموارد الأجهزة المتوفرة.

يمكنك استخدام التزامن عند التعامل مع المهام المرتبطة بالإدخال/الإخراج، مثل القراءة والكتابة على الملفات أو تقديم طلبات الشبكة، وعندما تكون قيود الذاكرة مصدر قلق.

استخدم المعالجة المتعددة عندما يكون لديك مهام مرتبطة بوحدة المعالجة المركزية والتي يمكن أن تستفيد من التوازي الحقيقي وعندما يكون لديك عزل قوي بين المهام، حيث لا ينبغي أن يؤثر فشل مهمة واحدة على المهام الأخرى.

الاستفادة من التزامن والتوازي

يعد التوازي والتزامن من الطرق الفعالة لتحسين استجابة وأداء كود بايثون الخاص بك. من المهم فهم الاختلافات بين هذه المفاهيم واختيار الإستراتيجية الأكثر فعالية.

تقدم Python الأدوات والوحدات التي تحتاجها لجعل التعليمات البرمجية الخاصة بك أكثر فعالية من خلال التزامن أو التوازي، بغض النظر عما إذا كنت تعمل مع عمليات مرتبطة بوحدة المعالجة المركزية أو عمليات مرتبطة بالإدخال/الإخراج.