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

Bythwn Llm Aljt Almt Ddt Llhlqt



المعالجة المتعددة قابلة للمقارنة مع العمليات المتعددة. ومع ذلك ، فإنه يختلف من حيث أنه لا يمكننا تنفيذ سوى مؤشر ترابط واحد في كل لحظة بسبب GIL المستخدم في الترابط. المعالجة المتعددة هي عملية تنفيذ العمليات بالتسلسل عبر العديد من نوى وحدة المعالجة المركزية. لا يمكن تشغيل الخيوط بالتوازي. ومع ذلك ، تتيح لنا المعالجة المتعددة إنشاء العمليات وتشغيلها بشكل متزامن على نوى وحدة المعالجة المركزية المختلفة. الحلقة ، مثل الحلقة for-loop ، هي إحدى لغات البرمجة النصية الأكثر استخدامًا. كرر نفس العمل باستخدام بيانات مختلفة حتى يتم الوصول إلى معيار ، مثل عدد التكرارات المحدد مسبقًا. الحلقة تحقق كل تكرار واحدًا تلو الآخر.

مثال 1: استخدام For-Loop في Python Multiprocessing Module

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







من خلال استخدام العمليات الفرعية بدلاً من الخيوط ، توفر حزمة المعالجة المتعددة كلاً من التزامن المحلي والبعيد ، وبالتالي تجنب قفل المترجم العالمي. استخدم for-loop ، والذي يمكن أن يكون كائن سلسلة أو tuple ، للتكرار باستمرار خلال تسلسل. يعمل هذا بشكل أقل شبهاً بالكلمة الرئيسية التي تظهر في لغات البرمجة الأخرى ويشبه إلى حد كبير طريقة المكرر الموجودة في لغات البرمجة الأخرى. من خلال بدء معالجة متعددة جديدة ، يمكنك تشغيل حلقة for-loop التي تنفذ إجراءً بشكل متزامن.



لنبدأ بتنفيذ التعليمات البرمجية لتنفيذ التعليمات البرمجية باستخدام أداة 'spyder'. نعتقد أن 'spyder' هو الأفضل أيضًا لتشغيل Python. نقوم باستيراد عملية وحدة معالجة متعددة يعمل بها الكود. تؤدي المعالجة المتعددة في مفهوم Python المسمى 'فئة العملية' إلى إنشاء عملية Python جديدة ، وتمنحها طريقة لتنفيذ التعليمات البرمجية ، وتعطي التطبيق الأصلي طريقة لإدارة التنفيذ. تحتوي فئة العملية على إجراءات البدء () وعملية الانضمام () ، وكلاهما مهم.



بعد ذلك ، نحدد وظيفة يحددها المستخدم تسمى 'func'. نظرًا لأنها وظيفة محددة من قبل المستخدم ، فإننا نمنحها اسمًا من اختيارنا. داخل جسم هذه الوظيفة ، نقوم بتمرير متغير 'الموضوع' كوسيطة وقيمة 'الرياضيات'. بعد ذلك ، نسمي الدالة 'print ()' ، ونمرر العبارة 'اسم الموضوع المشترك' بالإضافة إلى وسيطة 'الموضوع' التي تحتوي على القيمة. بعد ذلك ، في الخطوة التالية ، نستخدم 'if name == _main_' ، والذي يمنعك من تشغيل الكود عند استيراد الملف كوحدة نمطية ويسمح لك فقط بالقيام بذلك عند تنفيذ المحتوى كبرنامج نصي.





قد يُنظر إلى قسم الشرط الذي تبدأ به في معظم الظروف على أنه موقع لتوفير المحتوى الذي يجب تنفيذه فقط عند تشغيل ملفك كبرنامج نصي. ثم نستخدم موضوع المناقشة ونخزن فيه بعض القيم وهي 'علم' و 'إنجليزي' و 'كمبيوتر'. ثم يتم تسمية العملية باسم 'process1 []' في الخطوة التالية. ثم نستخدم 'process (target = func)' لاستدعاء الوظيفة في العملية. الهدف يستخدم لاستدعاء الوظيفة ، ونحن نحفظ هذه العملية في المتغير 'P'.

بعد ذلك ، نستخدم 'process1' لاستدعاء وظيفة 'append ()' التي تضيف عنصرًا إلى نهاية القائمة التي لدينا في الوظيفة 'func'. نظرًا لأن العملية مخزنة في المتغير 'P' ، فإننا نمرر 'P' إلى هذه الوظيفة كوسيطة لها. أخيرًا ، نستخدم وظيفة 'start ()' مع 'P' لبدء العملية. بعد ذلك ، نقوم بتشغيل الطريقة مرة أخرى أثناء توفير وسيطة 'الموضوع' واستخدام 'for' في الموضوع. بعد ذلك ، باستخدام طريقة 'process1' و 'add ()' مرة أخرى ، نبدأ العملية. ثم يتم تشغيل العملية ويتم إرجاع الإخراج. ثم يُطلب من الإجراء إنهاء باستخدام تقنية 'Join ()'. لن يتم إنهاء العمليات التي لا تستدعي إجراء 'Join ()'. إحدى النقاط المهمة هي أنه يجب استخدام معلمة الكلمات الرئيسية 'args' إذا كنت تريد تقديم أي وسيطات خلال العملية.




الآن ، يمكنك أن ترى في المخرجات أنه يتم عرض العبارة أولاً عن طريق تمرير قيمة موضوع 'الرياضيات' الذي نمرره إلى وظيفة 'func' لأننا نسميها أولاً باستخدام وظيفة 'العملية'. بعد ذلك ، نستخدم الأمر 'append ()' للحصول على القيم التي كانت موجودة بالفعل في القائمة والتي تمت إضافتها في النهاية. ثم تم تقديم 'علم' و 'كمبيوتر' و 'إنجليزي'. ولكن ، كما ترى ، القيم ليست في التسلسل الصحيح. هذا لأنهم يفعلون ذلك بالسرعة التي ينتهي بها الإجراء ويبلغون عن رسالتهم.

مثال 2: تحويل متسلسل For-Loop إلى Multiprocessing Par-Loop المتوازي

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

الآن ، دعنا نبدأ في تنفيذ الشفرة. أولاً ، نقوم باستيراد كلمة 'sleep' من وحدة الوقت. باستخدام إجراء 'sleep ()' في وحدة الوقت ، يمكنك تعليق تنفيذ سلسلة الاستدعاء للمدة التي تريدها. بعد ذلك ، نستخدم كلمة 'عشوائي' من الوحدة العشوائية ، ونحدد دالة بالاسم 'func' ، ونمرر الكلمة الأساسية 'argu'. ثم نقوم بإنشاء قيمة عشوائية باستخدام 'val' وضبطها على 'عشوائي'. بعد ذلك ، نمنع لفترة قصيرة باستخدام طريقة 'sleep ()' ونمرر 'val' كمعامل. بعد ذلك ، لنقل رسالة ، نقوم بتشغيل طريقة 'print ()' ، وتمرير الكلمات 'جاهز' والكلمة الأساسية 'arg' كمعامل لها ، وكذلك 'تم إنشاؤه' وتمرير القيمة باستخدام 'val'.

أخيرًا ، نستخدم 'flush' وضبطه على 'True'. يمكن للمستخدم أن يقرر ما إذا كان سيخزن الإخراج أم لا باستخدام خيار التدفق في وظيفة الطباعة في Python. تشير القيمة الافتراضية لهذه المعلمة إلى False إلى أنه لن يتم تخزين الإخراج مؤقتًا. يتم عرض الإخراج كسلسلة من الأسطر التي تتبع بعضها البعض إذا قمت بتعيينها على 'صواب'. ثم نستخدم 'if name == main' لتأمين نقاط الدخول. بعد ذلك ، نقوم بتنفيذ المهمة بالتتابع. هنا ، قمنا بتعيين النطاق على '10' مما يعني أن الحلقة تنتهي بعد 10 تكرارات. بعد ذلك ، نسمي وظيفة 'print ()' ، ونمررها عبارة الإدخال 'ready' ، ونستخدم الخيار 'flush = True'.


يمكنك الآن أن ترى أنه عندما ننفذ الكود ، تتسبب الحلقة في تشغيل الوظيفة '10' مرات. يتكرر خلال 10 مرات ، بدءًا من المؤشر صفر وينتهي عند المؤشر التاسع. تحتوي كل رسالة على رقم مهمة وهو رقم دالة نقوم بتمريره كـ 'arg' ورقم إنشاء.


يتم الآن تحويل هذه الحلقة المتسلسلة إلى حلقة متوازية متعددة المعالجات. نستخدم نفس الكود ، لكننا سنذهب إلى بعض المكتبات والوظائف الإضافية للمعالجة المتعددة. لذلك ، يجب علينا استيراد العملية من المعالجة المتعددة ، تمامًا كما أوضحنا سابقًا. بعد ذلك ، نقوم بإنشاء دالة تسمى 'func' ونمرر الكلمة الأساسية 'arg' قبل استخدام 'val = random' للحصول على رقم عشوائي.

بعد ذلك ، بعد استدعاء طريقة 'print ()' لإظهار رسالة وإعطاء المعلمة 'val' لتأخير فترة قصيرة ، نستخدم وظيفة 'if name = main' لتأمين نقاط الدخول. عندئذٍ ، نقوم بإنشاء عملية واستدعاء الوظيفة في العملية باستخدام 'العملية' ونمرر 'target = func'. ثم نمرر 'func' و 'arg' ونمرر القيمة 'm' ونمرر النطاق '10' مما يعني أن الحلقة تنهي الوظيفة بعد تكرار '10'. بعد ذلك ، نبدأ العملية باستخدام طريقة 'start ()' مع 'العملية'. بعد ذلك ، نسمي طريقة 'Join ()' لانتظار تنفيذ العملية وإكمال العملية بالكامل بعد ذلك.


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

استنتاج

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