اذهب إلى المحتوى

السؤال

نشر (معدل)

حاولت فهم تعدد المهام بايثون و حفظه حرفياً لم استطع مع اني انتهيت من تعلم بايثون ثانياً لكن بشكل عام كلما احاول كتابة اي كود لا اعرف اين ابدأ و ماذا اكتب و هل يجب كلمة محددة ام اي كلمة عند كتابة كلاس مثلاً

تم التعديل في بواسطة Carol Carol

Recommended Posts

  • 0
نشر

فهم تعدد المهام Concurrency يتطلب استيعاب لبعض المفاهيم الأساسية، وصعوبة كتابة الكود تأتي من عدم وضوح الهدف المراد تحقيقه، فتعدد المهام ليس أداة واحدة، بل مجموعة من التقنيات، واختيار التقنية المناسبة يعتمد على ما تريد تحقيقه.

أولاً الـ Processes أو العمليات هي عملية مستقلة تمامًا عن باقي العمليات، لها مساحة ذاكرة خاصة بها، وإنشاء عملية جديدة يعني إنشاء برنامج جديد تمامًا.

وذلك مناسب للمهام التي تتطلب عزلًا تامًا أو استخدام موارد كبيرة، والمكتبة المستخدمة هي multiprocessing.

للتوضيح بمثال بسيط لحساب مربع الأعداد من 1 إلى 5 في عمليات منفصلة:

import multiprocessing

def square(n):
  return n * n

if __name__ == '__main__':
  with multiprocessing.Pool(processes=5) as pool:
    results = pool.map(square, range(1, 6))
    print(results)  # Output: [1, 4, 9, 16, 25]

المفهوم الثاني هو الخيوط Threads وهي خيوط متعددة تعمل ضمن نفس العملية، وتشارك نفس مساحة الذاكرة، وإنشاء خيط أسرع من إنشاء عملية، لكنها تشارك الموارد.

وهي مناسبة للمهام التي تتطلب سرعة عالية وتشارك البيانات، لكن يجب الانتباه إلى مشاكل التزامن (Race Conditions).

والمكتبة المستخدمة هي threading.

وإليك مثال بسيط لطباعة رسائل من خيوط مختلفة:

import threading
import time

def print_message(message):
  for i in range(5):
    print(f"Thread {threading.current_thread().name}: {message}")
    time.sleep(1)

if __name__ == '__main__':
  thread1 = threading.Thread(target=print_message, args=("Hello",))
  thread2 = threading.Thread(target=print_message, args=("World",))
  thread1.start()
  thread2.start()
  thread1.join()
  thread2.join()

المفهوم الثالث هو المهام المتزامنة Coroutine/Asyncio ولا تنشئ عمليات أو خيوط جديدة، بل تنتقل بين المهام بشكل غير متزامن باستخدام الكلمات المفتاحية async و await، ومناسب للمهام التي تتضمن انتظارًا (مثل طلبات الشبكة) أي عمليات I/O كثيفة (مثل الشبكات، قواعد البيانات)، حيث لا يتم حجب الخيط أثناء الانتظار.

والمكتبة المستخدمة هي asyncio، وكمثال بسيط لطباعة رسائل مع تأخير باستخدام Asyncio:

import asyncio

async def print_message(message, delay):
  await asyncio.sleep(delay)
  print(f"Message: {message}")

async def main():
  await asyncio.gather(
      print_message("Hello", 2),
      print_message("World", 1)
  )

asyncio.run(main())

بالتالي عليك تحديد ما الذي تريد تحقيقه بتعدد المهام؟ هل تريد تسريع عملية حسابية؟ هل تريد التعامل مع طلبات متعددة من الشبكة؟

فالعمليات مناسبة للمهام المستقلة، الخيوط للمهام التي تشارك البيانات، والمهام المتزامنة للمهام التي تتضمن انتظارًا.

ولا تحاول كتابة برنامج معقد من البداية، ابدأ بمثال بسيط وفهم كيفية عمله قبل إضافة تعقيدات.

  • 0
نشر

اريد برنامج بلغة بايتون يوضح مفهوم التزامن اكتر؟!!

بتاريخ On 29‏/9‏/2024 at 20:50 قال Carol Carol:

حاولت فهم تعدد المهام بايثون و حفظه حرفياً لم استطع مع اني انتهيت من تعلم بايثون ثانياً لكن بشكل عام كلما احاول كتابة اي كود لا اعرف اين ابدأ و ماذا اكتب و هل يجب كلمة محددة ام اي كلمة عند كتابة كلاس مثلاً

 

  • 0
نشر
بتاريخ منذ ساعة مضت قال Aroona Ab:

اريد برنامج بلغة بايتون يوضح مفهوم التزامن اكتر؟!!

التزامن ببساطة تقنية برمجية تتيح للبرنامج تنفيذ عدة مهام في نفس الوقت، أي أن البرنامج يمكنه القيام بمهام متعددة في نفس الوقت، بدلاً من انتظار انتهاء المهام السابقة قبل البدء في المهام الجديدة.

للتوضيح، ساستخدم مكتبة threading في بايثون لإنشاء خيطين Threads منفصلين، الخيط Thread الأول سيقوم بطباعة الأرقام من 1 إلى 10، والخيط الثاني سيقوم بطباعة الأحرف من A إلى J.

وسيصبح البرنامج كالتالي وإليك تعليقات لتوضيح الأمر:

import threading
import time

# دالة للخيط الأول
def print_numbers():
    for i in range(1, 11):
        print(i)
        time.sleep(0.5)  # انتظر نصف ثانية قبل الطباعة التالية

# دالة للخيط الثاني
def print_letters():
    for letter in 'ABCDEFGHIJ':
        print(letter)
        time.sleep(0.5)  # انتظر نصف ثانية قبل الطباعة التالية

# إنشاء خيطين
thread1 = threading.Thread(target=print_numbers)
thread2 = threading.Thread(target=print_letters)

# بدء الخيطين
thread1.start()
thread2.start()

# انتظار انتهاء الخيطين
thread1.join()
thread2.join()

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

1
A
2
B
3
C
4
D
5
E
6
F
7
G
8
H
9
I
10
J

وللعلم بايثون لديها بعض القيود فيما يتعلق بالتزامن، بسبب ما يعرف بـ "Global Interpreter Lock" (GIL).

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

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...