بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته
السلام عليكم ورحمة الله وبركاته
أساسيات ال Threading في بايثون .
بعض المعلومات :
عندما تطلب تشغيل أي برنامج يقوم نظام التشغيل لينكس بتشغيله وإعطائه رقم تعريف فريد يسمى PID وهي إختصار ل Process ID .
كل Process تحتوي إفتراضيا واحد Thread تسمى Main Thread لاكن ممكن أن يقوم المبرمج بطلب تشغيل أكثر من Thread بشكل متوازي او بشكل إذا صح التعبير عشوائي أي لا يوجد ترابط بين ال Threads أي كل Thread يقوم بعمل معين لوحده يعني هذا الأمر يحدده المبرمج بناءا على ما يناسبه .
ما هو ال Thread ؟
بشكل بسيط لنفترض ال Process هي عملية بناء منزل فيها على الأقل واحد Thread أي عامل واحد يقوم بمهمة معينة إذا أراد المبرمج عمل شيء ما من دون أن يعيق عمل ال Thread الرئيسية كما ذكرت سابقا تسمى Main thread يقوم بعمل Thread أخر أو أكثر للقيام بهذه العملية .
مثال عملي إذا حاولت برمجة برنامج بواجهة رسومية ستعمل الواجهة الرسومية للبرنامج في ال Main thread من اعمالها مثلا تلقي الأحداث وإرسال الإشارات في حال الضغط بمأشر الفأرة مثلا على زر button معين وبعض الأشياء الروتينية والضرورية .
إذا أردت أن تقوم بتشغيل شيء ما يأخذ وقت مثلا عند الضغط على الزر button الفلاني يقوم بتحديث النظام كما نعلم تحديث النظام يأخذ وقت احيانا إذا تم مثلا تشغيل مدير الحزم مثلا dnf أو apt في Main thread ستحصل مشكلة ستتوقف واجهة البرنامج عن تلقي الأحداث وتعلق إلى أن ينتهي مدير الحزم من عمله وأحيانا نظام التشغيل يخبرك أن البرنامج عالق هل تريد قتله أي الخروج منه بالقوة ؟ طبعا هذا ليس جيد لبرنامجك لهذا ستحتاج thread.
الأساسيات بشكل عملي سأضع الصورة وتحتها الشرح .
نستدعي مكتبة threading ونلاحظ اول دالة Function تعرض عدد ال Thread المفعلة الأن وثاني دالة تعرض قائمة بهذه الThreads المفعلة .
نلاحظ بشكل إفتراضي لا يوجد إلا Thread واحدة والتي هي Main Thread .
قمت بعمل دالة سميتها f وشغلتها في Thread أخر ثم طلبت من ال Main Thread طباعة كلمة Done نلاحظ أن البرنامج يعمل سطر سطر أولا يشغل ال Thread اخر من خلال دالة start ولا يتم إنتظار دالة f حتى تنتهي أي يتم العودة فورا إلى ال Main Thread ويطبع كلمة Done .
نلاحظ أيضا ان البرنامج أو ال Main Thread لا تخرج حتى تنتهي كل ال Threads اﻷخرى من عملها .
في حال جعلنا daemon بقيمة True لن ينتظر البرنامج ال Threads الأخرى بل سيتم غلق البرنامج في حالة إنتهاء ال Main Thread من عملها .
ملاحظة ممكن أيضا تعين قيمة daemon من خلال وظيفة setDaemon لاكن يجب إستدعائها قبل وظيفة start .
عمل دالة join هو الإنتظار في مكان إستدعائها حتى ينتهي ال Thread من عمله لهذا نلاحظ أنه لم يتم الرجوع فورا إلى ال Main Thread لطباعة كلمة Done بل تم الأمر عند إنتهاء th من علمها عندها تم تنفيذ كل شيء أسفل مكان إستدعاء دالة join .
نلاحظ ممكن تمرير البارامترات للدالة من خلال args ونضعهم داخل tuple .
1-قمت بتشغيل أول Thread .
2-قمت بتشغيل ثاني Thread .
3-عملت join لأول Thread .
4-عملت join لثاني Thread .
أي شغلت إثنين Thread ولن يتم الإنتقال لل Main Thread حتى ينتهي الإثنين من عملهم.
ذات الشيء في الأعلى لاكن هنا نلاحظ ان دالة join لأول Thread تاتي قبل تشغيل ثاني Thread لهذا لن يعمل ثاني Thread حتى تنتهي أول Thread من عملها .
أخيرا ممكن تعين إسم مميز لل Thread وباقي الدوال أو حتى نكون دقيقين باقي الوظائف Method والمتغيرات واضحة من أسمائها .
1-متعير name سبق وشاهدناها في الشرح .
2-متغير daemon سبق وشاهدناها في الشرح .
3- وظيفة setDaemon سبق وشاهدناها في الشرح .
4-وظيفة setName واضحة طريقة أخرى لتحديد الإسم .
5- وظيفة start سبق وشاهدناها في الشرح .
6-وظيفة join سبق وشاهدناها في الشرح .
7-وظيفة is_alive و isAlive للإستعلام إذا ما كان ال Thread يعمل بالفعل .
8- isDaemon للإستعلام عن قيمة daemon .
9-وظيفة getName للإستعلام عن إسم ال Thread .
10-متغير ident رقم مميز يميز كل thread.
11-وظيفة run ساتركها للجزء الثاني إن شاء الله شأشرحها في وقتها مع بعض الأمثلة لبرنامج بسيط بواجهة رسومية من خلال مكتبة Gtk+ و بايثون وأمثلة بسيطة عن تبادل المعلومات بين ال Threads المختلفة.
ممكن أن تضيف لمعلوماتك إقرأ عن ال async function vs sync إبحث في جوجل لتعرف الفرق بين الدوال التي تعمل block لل thread التي تعمل منها والتي لا تعمل block ويمكنك أيضا أن تقرأ مواضيع أخرى عن الأمر بالغة الإنجليزية وأيضا ممكن أن تقرأ عن python multiprocessing و تعرف الفرق بينه وبين ال threading .