الفرق بين المراجعتين لصفحة: «Ruby/Thread»

من موسوعة حسوب
لا ملخص تعديل
طلا ملخص تعديل
سطر 2: سطر 2:
[[تصنيف: Ruby]]
[[تصنيف: Ruby]]
[[تصنيف: Ruby Thread]]
[[تصنيف: Ruby Thread]]
المهام الفرعية (Threads) هي الطريقة التي تنفذ بها روبي البرمجة المتزامنة (concurrent programming).
المهام الفرعية (Threads، وتدعى "الخيوط" أيضًا) هي الطريقة التي تنفذ بها روبي البرمجة المتزامنة (concurrent programming).


البرامج التي تتطلب تنفيذ عدة مهام فرعية يمكنها استخدام الصنف <code>Thread</code>.
البرامج التي تتطلب تنفيذ عدة مهام فرعية يمكنها استخدام الصنف <code>Thread</code>. على سبيل المثال، يمكننا إنشاء مهمة فرعية جديدة منفصلة عن المهمة الرئيسية باستخدام <code>[[Ruby/Thread/new|new]]</code>.<syntaxhighlight lang="ruby">thr = Thread.new { puts "Whats the big deal" }‎</syntaxhighlight>ثم يمكننا إيقاف تنفيذ المهمة الفرعية الرئيسية مؤقتًا إلى حين إنتهاء المهمة الفرعية خاصتنا باستخدام التابع <code>[[Ruby/Thread/join|join]]</code>:<syntaxhighlight lang="ruby">thr.join #=> "Whats the big deal"‎</syntaxhighlight>في حال عدم استدعاء الت ابع [[Ruby/Thread/join|<code>join</code>]] قبل انتهاء المهمة الرئيسية، فسيتم إنهاء جميع المهام الفرعية الأخرى، بما في ذلك المهمة الفرعية التي أنشأناها.


على سبيل المثال، يمكننا إنشاء مهمة فرعية جديدة منفصلة عن المهمة الرئيسية باستخدام <code>[[Ruby/Thread/new|new]]</code>.<syntaxhighlight lang="ruby">thr = Thread.new { puts "Whats the big deal" }‎</syntaxhighlight>ثم يمكننا إيقاف تنفيذ المهمة الفرعية الرئيسية مؤقتًا إلى حين إنتهاء المهمة الفرعية خاصتنا باستخدام التابع <code>[[Ruby/Thread/join|join]]</code>:<syntaxhighlight lang="ruby">thr.join #=> "Whats the big deal"‎</syntaxhighlight>في حال عدم استدعاء التابع [[Ruby/Thread/join|<code>join</code>]] قبل انتهاء المهمة الرئيسية ، فسيتم إنهاء جميع المهام الفرعية الأخرى، بما في ذلك المهمة الفرعية التي أنشأناها.
بدلاً من ذلك، يمكنك استخدام [[Ruby/Array|مصفوفة]] للتعامل مع عدة مهام فرعية في وقت واحد كما في المثال التالي:<syntaxhighlight lang="ruby">threads = []
 
بدلاً من ذلك، يمكنك استخدام [[Ruby/Array|مصفوفة]] للتعامل مع عدة مهام فرعية في وقت واحد ، كما في المثال التالي:<syntaxhighlight lang="ruby">threads = []
threads << Thread.new { puts "Whats the big deal" }
threads << Thread.new { puts "Whats the big deal" }
threads << Thread.new { 3.times { puts "Threads are fun!" } }‎</syntaxhighlight>بعد إنشاء عدد من المهام الفرعية، سننتظر أن تنتهي جميعها بالتتابع.<syntaxhighlight lang="ruby">threads.each { |thr| thr.join }‎</syntaxhighlight>
threads << Thread.new { 3.times { puts "Threads are fun!" } }‎</syntaxhighlight>بعد إنشاء عدد من المهام الفرعية، سننتظر إلى أن تنتهي جميعها بالتتابع.<syntaxhighlight lang="ruby">threads.each { |thr| thr.join }‎</syntaxhighlight>
==تهيئة المهام الفرعية (Thread initialization)==
==تهيئة المهام الفرعية==
لإنشاء مهام فرعية جديدة، توفر روبي عدة توابع لذلك: <code>[[Ruby/Thread/new|new]]</code> و <code>[[Ruby/Thread/start|start]]</code> و <code>[[Ruby/Thread/fork|fork]]</code>. يجب تمرير كتلة مع كل هذه التوابع، وإلا سيُطلق استثناء <code>[[Ruby/ThreadError|ThreadError]]</code>.
لإنشاء مهام فرعية جديدة، توفر روبي عدة توابع لذلك هي: <code>[[Ruby/Thread/new|new]]</code> و <code>[[Ruby/Thread/start|start]]</code> و <code>[[Ruby/Thread/fork|fork]]</code>. يجب تمرير كتلة مع كل هذه التوابع، وإلا سيُطلق الاستثناء <code>[[Ruby/ThreadError|ThreadError]]</code>.


عند اشتقاق أصناف فرعية (subclasses) من <code>Thread</code>، فسيتم تجاهل التابع <code>initialize</code> الخاص بصنفك الفرعي من قبل التوابع <code>[[Ruby/Thread/start|start]]</code> و <code>[[Ruby/Thread/fork|fork]]</code>. لذلك تأكد من استدعاء المتغير <code>super</code> في التابع <code>initialize</code> خاصتك.
عند اشتقاق أصناف فرعية (subclasses) من <code>Thread</code>، فسيتم تجاهل التابع <code>initialize</code> الخاص بصنفك الفرعي من قبل التوابع <code>[[Ruby/Thread/start|start]]</code> و <code>[[Ruby/Thread/fork|fork]]</code>. لذلك تأكد من استدعاء المتغير <code>super</code> في التابع <code>initialize</code> خاصتك.
==إنهاء المهمة الفرعية (Thread termination)==
==إنهاء مهمة الفرعية==
توفر روبي مجموعة متنوعة من الطرق لإنهاء المهام الفرعية.
توفر روبي مجموعة متنوعة من الطرق لإنهاء المهام الفرعية. ينهي (أو يقتل) التابع <code>[[Ruby/Thread/kill|kill]]</code> مثلًا المهمة الفرعية المعطاة:<syntaxhighlight lang="ruby">thr = Thread.new { ... }
 
Thread.kill(thr) # sends exit() to thr‎</syntaxhighlight>أو يمكنك استخدام تابع النسخة <code>[[Ruby/Thread/exit|exit]]</code>، أو أحد الأسماء البديلة له وهي <code>[[Ruby/Thread/kill|kill]]</code> و <code>[[Ruby/Thread/terminate|terminate]]</code>.<syntaxhighlight lang="ruby">thr.exit‎</syntaxhighlight>
يقوم التابع <code>[[Ruby/Thread/kill|kill]]</code> بإنهاء المهمة الفرعية المعطاة:<syntaxhighlight lang="ruby">thr = Thread.new { ... }
==حالة مهمة الفرعية==
Thread.kill(thr) # sends exit() to thr‎</syntaxhighlight>أو يمكنك استخدام تابع النسخة <code>[[Ruby/Thread/exit|exit]]</code>، أو أحد مرادفيه <code>[[Ruby/Thread/kill|kill]]</code> و <code>[[Ruby/Thread/terminate|terminate]]</code>.<syntaxhighlight lang="ruby">thr.exit‎</syntaxhighlight>
توفر روبي عددًا من من توابع النسخة (instance methods) لاستخلاص حالة مهمة فرعية معينة. للحصول على [[Ruby/String|سلسلة نصية]] تحتوي حالة المهمة الفرعية الحالية، استخدم التابع <code>[[Ruby/Thread/status|status]]</code>:<syntaxhighlight lang="ruby">thr = Thread.new { sleep }
==حالة المهمة الفرعية (Thread status)==
توفر روبي عددا من من توابع النسخ (instance methods) لاستخلاص حالة مهمة فرعية معينة. للحصول على [[Ruby/String|سلسلة نصية]] تحتوي حالة المهمة الفرعية الحالية استخدم التابع <code>[[Ruby/Thread/status|status]]</code>:<syntaxhighlight lang="ruby">thr = Thread.new { sleep }
thr.status # => "sleep"
thr.status # => "sleep"
thr.exit
thr.exit
thr.status # => false‎</syntaxhighlight>يمكنك أيضًا استخدام <code>[[Ruby/Thread/alive-3F|alive?‎]]</code> للتحقق مما إذا كانت المهمة الفرعية قيد التشغيل أو نائمة، أو التابع <code>[[Ruby/Thread/stop-3F|stop?‎]]</code> للتحقق مما إذا كانت المهمة الفرعية ميتة أو نائمة.
thr.status # => false‎</syntaxhighlight>يمكنك أيضًا استخدام التابع <code>[[Ruby/Thread/alive-3F|alive?‎]]</code> للتحقق مما إذا كانت المهمة الفرعية قيد التشغيل أو نائمة، أو التابع <code>[[Ruby/Thread/stop-3F|stop?‎]]</code> للتحقق مما إذا كانت المهمة الفرعية ميتة أو نائمة.
==متغيرات ونطاق المهمة الفرعية (Thread variables and scope)==
==متغيرات ونطاق مهمة الفرعية==
نظرًا لكون المهام الفرعية تُنشأ بواسطة الكتل، فستنطبق القواعد نفسها على كتل روبي الأخرى فيما يتعلق بنطاق (scope) المتغيرات. المتغيرات المحلية التي تم إنشاؤها داخل هذه الكتلة لا يمكن الوصول إليها إلا من داخل هذه المهمة الفرعية.
نظرًا لكون المهام الفرعية تُنشأ بواسطة الكتل، فستُطبَّق القواعد نفسها على كتل روبي الأخرى فيما يتعلق بنطاق (scope) المتغيرات. المتغيرات المحلية التي تم إنشاؤها داخل هذه الكتلة لا يمكن الوصول إليها إلا من داخل هذه المهمة الفرعية.
==المتغيرات محلية-الألياف مقابل المتغيرات محلية المهام الفرعية (Fiber-local vs. Thread-local)==
==الألياف المحلية مقابل الخيوط المحلية==
يحتوي كل [[Ruby/Fiber|ليف]] (fiber) على نطاق خاص به لتخزين العناصر المعيّنة من المعامل <code>[[Ruby/Thread/index operator|[]]]</code>. عندما تقوم بتعيين متغير جديد محلى [[Ruby/Fiber|الليف]] (fiber-local)، فلن يمكن الوصول إليه إلا من داخل ذلك [[Ruby/Fiber|الليف]]. المثال التالي يوضح ذلك:<syntaxhighlight lang="ruby">Thread.new {
يحتوي كل [[Ruby/Fiber|ليف]] (fiber) على نطاق خاص به لتخزين العناصر المعيّنة من المعامل <code>[[Ruby/Thread/index operator|[]]]</code>. عندما تعيِّن [[Ruby/Fiber|ليفًا]] محليًّا (fiber-local)، فلن يمكن الوصول إليه إلا من داخل ذلك [[Ruby/Fiber|الليف]]. المثال التالي يوضح ذلك:<syntaxhighlight lang="ruby">Thread.new {
   Thread.current[:foo] = "bar"
   Thread.current[:foo] = "bar"
   Fiber.new {
   Fiber.new {
     p Thread.current[:foo] # => nil
     p Thread.current[:foo] # => nil
   }.resume
   }.resume
}.join‎</syntaxhighlight>يستخدم هذا المثال معامل الفهرسة <code>[[Ruby/Thread/index operator|[]]]</code> لأجل الاستخلاص، ويستخدم معامل التعيين <code>[[Ruby/Thread/5B-5D-3D|=[]]]</code> لأجل تعيين المتغيرات محلية [[Ruby/Fiber|الليف]] (fiber-locals)، يمكنك أيضاً استخدام التابع <code>[[Ruby/Thread/keys|keys]]</code> لسرد المتغيرات محلية [[Ruby/Fiber|الليف]] لمهمة فرعية معينة، أو التابع <code>[[Ruby/Thread/key-3F|key?‎]]</code> للتحقق من وجود متغيرات محلية [[Ruby/Fiber|الليف]].
}.join‎</syntaxhighlight>يستخدم هذا المثال معامل الفهرسة <code>[[Ruby/Thread/index operator|[]]]</code> لأجل الاستخلاص، ويستخدم معامل التعيين <code>[[Ruby/Thread/index operator-3D|=[]]]</code> لأجل تعيين [[Ruby/Fiber|ليف]] محلي (fiber-locals)؛ يمكنك أيضًا استخدام ال$تابع <code>[[Ruby/Thread/keys|keys]]</code> لإنشاء قائمة بالألياف المحلية لمهمة فرعية معينة، أو التابع <code>[[Ruby/Thread/key-3F|key?‎]]</code> للتحقق من وجود ألياف محلية.


يمكن الوصول إلى المتغيرات المحلية في المهمة الفرعية (thread-locals) من أي مكان في نطاق تلك المهمة. في المثال التالي:<syntaxhighlight lang="ruby">Thread.new{
يمكن الوصول إلى المتغيرات المحلية في المهمة الفرعية (thread-locals) من أي مكان في نطاق تلك المهمة. إليك المثال التالي:<syntaxhighlight lang="ruby">Thread.new{
   Thread.current.thread_variable_set(:foo, 1)
   Thread.current.thread_variable_set(:foo, 1)
   p Thread.current.thread_variable_get(:foo) # => 1
   p Thread.current.thread_variable_get(:foo) # => 1
سطر 47: سطر 43:
هذا المثال يستخدم التابع <code>[[Ruby/Thread/thread variable set|thread_variable_set]]</code> لإنشاء مهمة فرعية جديدة، ويستخدم <code>[[Ruby/Thread/thread variable get|thread_variable_get]]</code> للرجوع إليها.
هذا المثال يستخدم التابع <code>[[Ruby/Thread/thread variable set|thread_variable_set]]</code> لإنشاء مهمة فرعية جديدة، ويستخدم <code>[[Ruby/Thread/thread variable get|thread_variable_get]]</code> للرجوع إليها.


يمكن أيضًا استخدام التابع <code>[[Ruby/Thread/thread variables|thread_variables]]</code> لسرد جميع المتغيرات المحلية في المهمة الفرعية (thread-locals)، والتابع <code>[[Ruby/Thread/thread variable-3F|thread_variable?‎]]</code> للتحقق من وجود متغير محلي معين في المهمة الفرعية.
يمكن أيضًا استخدام التابع <code>[[Ruby/Thread/thread variables|thread_variables]]</code> لإنشاء قائمة بجميع المتغيرات المحلية في مهمة فرعية (thread-locals)، والتابع <code>[[Ruby/Thread/thread variable-3F|thread_variable?‎]]</code> للتحقق من وجود متغير محلي معين في مهمة فرعية.
==معالجة الاستثناء<code>Exception</code>==
==معالجة الاستثناء <code>[[Ruby/Exception|Exception]]</code>==
يمكن لأي مهمة فرعية إطلاق استثناء باستخدام تابع النسخة <code>[[Ruby/Thread/raise|raise]]</code>، والذي يعمل بطريقة مشابهة للتابع <code>[[Ruby/Kernel/raise|Kernel#raise]]</code>.
يمكن لأي مهمة فرعية إطلاق استثناء باستخدام تابع النسخة <code>[[Ruby/Thread/raise|raise]]</code>، والذي يعمل بطريقة مشابهة للتابع <code>[[Ruby/Kernel/raise|Kernel.raise]]</code>.


من الجدير بالذكر أنّ الاستثناءات التي تُطلق من أي مهمة الفرعية، باستثناء الرئيسية (main thread)، ستعتمد على <code>[[Ruby/Thread/abort on exception|abort_on_exception]]</code>. قيمة هذا الخيار الافتراضية هي <code>false</code>، مما يعني أن أي استثناء غير مُعالَج سيؤدي إلى إنهاء المهمة الفرعية بصمت عند الانتظار سواء من <code>[[Ruby/Thread/join|join]]</code> أو من <code>[[Ruby/Thread/value|value]]</code>. يمكنك تغيير هذا الإعداد الافتراضي عبر التعبير <code>[[Ruby/Thread/abort on exception-3D|abort_on_exception=]]</code><code>true</code> ، أو من خلال إعطاء <code>DEBUG</code> القيمة <code>true</code>.
من الجدير بالذكر أنّ الاستثناءات التي تُطلق من أي مهمة الفرعية، باستثناء الرئيسية (main thread)، التي تعتمد على <code>[[Ruby/Thread/abort on exception|abort_on_exception]]</code>. قيمة هذا الخيار الافتراضية هي <code>false</code>، مما يعني أن أي استثناء غير مُعالَج سيؤدي إلى إنهاء المهمة الفرعية بصمت عند الانتظار سواءً من <code>[[Ruby/Thread/join|join]]</code> أو من <code>[[Ruby/Thread/value|value]]</code>. يمكنك تغيير هذا الإعداد الافتراضي عبر استدعاء <code>[[Ruby/Thread/abort on exception-3D|abort_on_exception=]] true</code> ، أو من خلال إعطاء <code>[[Ruby/Thread/DEBUG|DEBUG]]</code> القيمة <code>true</code>.


مع إضافة تابع الصنف <code>[[Ruby/Thread/handle interrupt|handle_interrupt]]</code> ، يمكنك الآن معالجة الاستثناءات بشكل غير متزامن بالمهام الفرعية.
مع إضافة تابع الصنف <code>[[Ruby/Thread/handle interrupt|handle_interrupt]]</code>، يمكنك الآن معالجة الاستثناءات بشكل غير متزامن بالمهام الفرعية.
==الجدولة (Scheduling)==
==الجدولة (Scheduling)==
توفر روبي عدة وسائل لجدولة المهام الفرعية في البرنامج.
توفر روبي عدة وسائل لجدولة المهام الفرعية في البرنامج. الطريقة الأولى هي باستخدام تابع الصنف <code>[[Ruby/Thread/stop|stop]]</code>، لوضع المهمة الفرعية الحالية في حالة نوم، وجدولة عملية تنفيذ مهمة فرعية أخرى.
 
الطريقة الأولى هي باستخدام تابع الصنف <code>[[Ruby/Thread/stop|stop]]</code>، لوضع المهمة الفرعية الحالية في حالة نوم، وجدولة عملية تنفيذ مهمة فرعية أخرى.


بمجرد أن تصبح المهمة الفرعية في حالة نوم، يمكنك استخدام تابع النسخ <code>[[Ruby/Thread/wakeup|wakeup]]</code> لجعلها متاحة للجدولة.
بمجرد أن تصبح المهمة الفرعية في حالة نوم، يمكنك استخدام تابع النسخ <code>[[Ruby/Thread/wakeup|wakeup]]</code> لجعلها متاحة للجدولة.


يمكنك أيضًا استخدام التابع <code>[[Ruby/Thread/pass|pass]]</code>، والذي يحاول تمرير التنفيذ إلى مهمة فرعية أخرى، مسألة استبدال المهمة الفرعية قيد التشغيل تتعلق بنظام التشغيل المستخدم. وينطبق الأمر ذاته على التابع <code>[[Ruby/Thread/priority|priority]]</code>، والذي يتيح لك الطلب من مُجدوِل المهام الفرعية (thread scheduler) إعطاء الأسبقية  لمهام فرعية معينة عند التنفيذ. يعتمد هذا التابع أيضًا على نظام التشغيل، وقد يُتجاهل في بعض الأنظمة.
يمكنك أيضًا استخدام التابع <code>[[Ruby/Thread/pass|pass]]</code>، والذي يحاول تمرير التنفيذ إلى مهمة فرعية أخرى؛ مسألة استبدال المهمة الفرعية قيد التشغيل تتعلق بنظام التشغيل المستخدم. وينطبق الأمر ذاته على التابع <code>[[Ruby/Thread/priority|priority]]</code>، والذي يتيح لك الطلب من مُجدوِل المهام الفرعية (thread scheduler) إعطاء الأسبقية  لمهام فرعية معينة عند التنفيذ. يعتمد هذا التابع أيضًا على نظام التشغيل، وقد يُتجاهَل في بعض الأنظمة.
==توابع الصنف العامة (Public Class Methods)==
==توابع الصنف العامة==
===[[Ruby/Thread/DEBUG| التابع DEBUG]]===
===[[Ruby/Thread/DEBUG|<code>DEBUG</code>]]===
يُعيد التابع <code>DEBUG</code> مستوى التصحيح في [[Ruby/Thread|المهمة الفرعية]] (thread debug level).
يُعيد مستوى التصحيح في المهمة الفرعية (thread debug level).
===[[Ruby/Thread/DEBUG-3D| التابع DEBUG=‎]]===
===[[Ruby/Thread/DEBUG-3D|<code>DEBUG=‎</code>]]===
يعيّن التابع <code>DEBUG=</code> مستوى تصحيح [[Ruby/Thread|المهمة الفرعية]] (thread debug level). م
يعيّن عند استدعائه بالشكل <code>DEBUG = num</code> قيمة مستوى تصحيح <nowiki/>[[Ruby/Thread|المهمة الفرعية]](thread debug level) إلى القيمة <code>num</code>.
===[[Ruby/Thread/abort on exception| التابع abort_on_exception]]===
===[[Ruby/Thread/abort on exception|<code>abort_on_exception</code>]]===
يُعيد التابع <code>abort_on_exception</code> حالة الشرط العام "abort on exception".
يُعيد حالة الشرط العام "المقاطعة عند حدوث استثناء؟" (abort on exception). 
===[[Ruby/Thread/abort on exception-3D| التابع abort_on_exception=]]===
===[[Ruby/Thread/abort on exception-3D|<code>abort_on_exception=‎</code>]]===
عند إعطائه القيمة <code>true</code>، فأي [[Ruby/Thread|مهمة فرعية]] توقف بواسطة استثناء، سيتم إطلاق ذلك الاستثناء مجددا في [[Ruby/Thread|المهمة الفرعية]] الرئيسية (main thread).
يضبط عند استدعائه بالشكل <code>abort_on_exception= boolean</code> حالة الشرط العام "المقاطعة عند حدوث استثناء؟" (abort on exception) إلى القيمة المنطقية <code>boolean</code>.
===[[Ruby/Thread/current| التابع current]]===
===[[Ruby/Thread/current|<code>current</code>]]===
يُعيد التابع <code>current</code> [[Ruby/Thread|المهمة الفرعية]] المُنفّذة حاليا.
يُعيد المهمة الفرعية المُنفّذة حاليًّا.
===[[Ruby/Thread/exclusive| التابع exclusive]]===
===[[Ruby/Thread/exclusive|<code>exclusive</code>]]===
يغلف التابع <code>exclusive</code> الكتلة المعطاة في دالة الآلة الافتراضية العامة (VM-global)‏ <code>[[Ruby/Mutex/synchronize|Mutex#synchronize]]</code> .
يغلف الكتلة المعطاة في دالة الآلة الافتراضية العامة (VM-global)‏<code>[[Ruby/Mutex/synchronize|Mutex.synchronize]]</code>، ثم يعيد قيمة الكتلة.
===[[Ruby/Thread/exit| التابع exit]]===
===[[Ruby/Thread/exit|<code>exit</code>]]===
ينهي التابع <code>exit</code> [[Ruby/Thread|المهمة الفرعية]] قيد التشغيل، ويُجدول [[Ruby/Thread|مهمة فرعية]] أخرى ليتم تشغيلها.
ينهي المهمة الفرعية قيد التشغيل، ويُجدول مهمة فرعية أخرى ليتم تشغيلها.
===[[Ruby/Thread/fork| التابع fork]]===
===[[Ruby/Thread/fork|<code>fork</code>]]===
التابع <code>fork</code> مكافئ للتابع <code>new</code>.
ينشئ عملية فرعية جديدة بشكل مكافئ للتابع new.
===[[Ruby/Thread/handle interrupt| التابع handle_interrupt]]===
===[[Ruby/Thread/handle interrupt|<code>handle_interrupt</code>]]===
يغير التابع <code>handle_interrupt</code> توقيت التوقيف غير المتزامن (asynchronous interrupt timing).
يغير توقيت المقاطعة غير المتزامنة (asynchronous interrupt timing).
===[[Ruby/Thread/kill| التابع kill]]===
===[[Ruby/Thread/kill|<code>kill</code>]]===
بقوم التابع <code>kill</code> بإنهاء المهمة الفرعية المعطاة.
ينهي المهمة الفرعية المعطاة.
===[[Ruby/Thread/list| التابع list]]===
===[[Ruby/Thread/list|<code>list</code>]]===
يُعيد التابع <code>list</code> [[Ruby/Array|مصفوفة]] من [[Ruby/Thread|المهام الفرعية]] المشتغلة أو المتوقفة.
يُعيد [[Ruby/Array|مصفوفة]] من المهام الفرعية العاملة أو المتوقفة.
===[[Ruby/Thread/main| التابع main]]===
===[[Ruby/Thread/main|<code>main</code>]]===
يُعيد التابع <code>main</code> [[Ruby/Thread|المهمة الفرعية]] الرئيسية.
يُعيد المهمة الفرعية الرئيسية.
===[[Ruby/Thread/new| التابع new]]===
===[[Ruby/Thread/new|<code>new</code>]]===
ينشئ التابع <code>new</code> [[Ruby/Thread|مهمة فرعية]] جديدة تقوم بتنفيذ الكتلة المعطاة.
ينشئ مهمة فرعية جديدة تقوم بتنفيذ الكتلة المعطاة.
===[[Ruby/Thread/pass| التابع pass]]===
===[[Ruby/Thread/pass|<code>pass</code>]]===
يعطي التابع <code>pass</code> إلى مُجدوِل [[Ruby/Thread|المهمة الفرعية]] تلميحًا لتمرير التنفيذ إلى [[Ruby/Thread|مهمة فرعية]] أخرى.
يعطي إلى مُجدوِل المهمة الفرعية تلميحًا لتمرير التنفيذ إلى مهمة فرعية أخرى.
===[[Ruby/Thread/pending interrupt-3F| التابع pending_interrupt?‎]]===
===[[Ruby/Thread/pending interrupt-3F|<code>pending_interrupt?‎</code>]]===
يتحقق التابع <code>pending_interrupt?‎</code> مما إذا كان طابور الانتظار غير المتزامن فارغًا أم لا.
يتحقق مما إذا كان طابور الانتظار غير المتزامن فارغًا أم لا.
===[[Ruby/Thread/report on exception| التابع report_on_exception]]===
===[[Ruby/Thread/report on exception|<code>report_on_exception</code>]]===
يعيد التابع <code>report_on_exception</code> حالة report on exception".
يعيد حالة "التبليغ عند الاستثناء" (report on exception). 
===[[Ruby/Thread/report on exception-3D| التابع report_on_exception=‎]]===
======[[Ruby/Thread/report on exception-3D|<code>report_on_exception=‎</code>]]======
يُعيد التابع <code>report_on_exception=</code> الحالة الجديدة.
يضبط عند استدعائه بالشكل <code>report_on_exception= boolean‎</code> حالة "التبليغ عند الاستثناء" (report on exception).
===[[Ruby/Thread/start| التابع start]]===
===[[Ruby/Thread/start|<code>start</code>]]===
يشبه التابع <code>start</code> التابع <code>[[Ruby/Thread/new|new]]</code>.
يشبه التابع <code>[[Ruby/Thread/new|new]]</code> بشكل أساسي إلا أنه عند اشتقاق صنف فرعي (subclassed) من <code>[[Ruby/Thread|Thread]]</code>، فإنَّ استدعاء <code>start</code> في ذلك الصنف الفرعي لن يستدعي تابع الصنف الفرعي<code>initialize</code>.
===[[Ruby/Thread/stop| التابع stop]]===
===[[Ruby/Thread/stop|<code>stop</code>]]===
يوقف التابع <code>stop</code> تنفيذ [[Ruby/Thread|المهمة الفرعية]] الحالية،
يوقف تنفيذ المهمة الفرعية الحالية، ويضعها في حالة "نوم" (sleep)، ويُجدوٍل (schedules) تنفيذ مهمة فرعية أخرى.


== تزوابع النسخة العامة (Public Instance Methods) ==
== تزوابع النسخة العامة (Public Instance Methods) ==


===[[Ruby/Thread/index operator| التابع []]]===
===<code rel="mw:WikiLink" href="Ruby/Thread/index operator" title="Ruby/Thread/index operator">[[Ruby/Thread/index operator|[]]]</code>===
مرجع الخصائص (Attribute Reference) - يُعيد قيمة متغير [[Ruby/Fiber|الليف]] المحلي fiber-local variable
مرجع الخصائص (Attribute Reference) - يُعيد قيمة متغير [[Ruby/Fiber|الليف]] المحلي fiber-local variable
===[[Ruby/Thread/index operator-3D| التابع []=]]===
===[[Ruby/Thread/index operator-3D|<code>[]=</code>]]===
معامل تعيين الخاصيات (Attribute Assignment) - يعيّن أو ينشئ قيمة متغير محلي [[Ruby/Fiber|الليف]]، باستخدام إما رمز أو [[Ruby/String|سلسلة نصية]].
معامل تعيين الخاصيات (Attribute Assignment) - يعيّن أو ينشئ قيمة متغير محلي [[Ruby/Fiber|الليف]]، باستخدام إما رمز أو [[Ruby/String|سلسلة نصية]].
===[[Ruby/Thread/abort on exception| التابع abort_on_exception]]===
===[[Ruby/Thread/abort on exception|<code>abort_on_exception</code>]]===
يُعيد التابع <code>abort_on_exception</code> حالة الشرط "abort on exception".
يُعيد <code>abort_on_exception</code> حالة الشرط "abort on exception".
===[[Ruby/Thread/abort on exception-3D| التابع abort_on_exception=‎]]===
===[[Ruby/Thread/abort on exception-3D|<code>abort_on_exception=‎</code>]]===
عند إعطائه القيمة <code>true</code>، إذا تم إيقاف أي [[Ruby/Thread|مهمة فرعية]] بواسطة استثناء، فسيطلق ذلك الاستثناء مجددا في [[Ruby/Thread|المهمة الفرعية]] الرئيسية.
عند إعطائه القيمة <code>true</code>، إذا تم إيقاف أي [[Ruby/Thread|مهمة فرعية]] بواسطة استثناء، فسيطلق ذلك الاستثناء مجددا في [[Ruby/Thread|المهمة الفرعية]] الرئيسية.
===[[Ruby/Thread/add trace func| التابع add_trace_func]]===
===[[Ruby/Thread/add trace func|<code>add_trace_func</code>]]===
يضيف التابع <code>add_trace_func</code> الوسيط المعطى <code>proc</code>  كمعالج للتعقب (tracing).
يضيف <code>add_trace_func</code> الوسيط المعطى <code>proc</code>  كمعالج للتعقب (tracing).
===[[Ruby/Thread/alive-3F| التابع alive?‎]]===
===[[Ruby/Thread/alive-3F|<code>alive?‎</code>]]===
يُعيد التابع <code>alive?‎</code> القيمة <code>true</code> إن كانت [[Ruby/Thread|المهمة الفرعية]] التي استُدعي معها قيد التشغيل أو نائمة.
يُعيد <code>alive?‎</code> القيمة <code>true</code> إن كانت [[Ruby/Thread|المهمة الفرعية]] التي استُدعي معها قيد التشغيل أو نائمة.
===[[Ruby/Thread/backtrace| التابع backtrace]]===
===[[Ruby/Thread/backtrace|<code>backtrace</code>]]===
يُعيد التابع <code>backtrace</code> المتعقب (backtrace) الحالي لل[[Ruby/Thread|مهمة فرعية]].
يُعيد <code>backtrace</code> المتعقب (backtrace) الحالي لل[[Ruby/Thread|مهمة فرعية]].
===[[Ruby/Thread/backtrace locations| التابع backtrace_locations]]===
===[[Ruby/Thread/backtrace locations|<code>backtrace_locations</code>]]===
يُعيد التابع <code>backtrace_locations</code> مكدس التنفيذ (execution stack) الخاص ب[[Ruby/Thread|المهمة الفرعية]] — [[Ruby/Array|مصفوفة]] تحتوي على كائنات تعقب (backtrace location objects).
يُعيد <code>backtrace_locations</code> مكدس التنفيذ (execution stack) الخاص ب[[Ruby/Thread|المهمة الفرعية]] — [[Ruby/Array|مصفوفة]] تحتوي على كائنات تعقب (backtrace location objects).
===[[Ruby/Thread/exit| التابع exit]]===
===[[Ruby/Thread/exit|<code>exit</code>]]===
ينهي التابع <code>exit</code> [[Ruby/Thread|المهمة الفرعية]] قيد التشغيل حاليًا، ويُجدوِل (schedules) [[Ruby/Thread|مهمة فرعية]] أخرى ليتم تشغيلها.
ينهي <code>exit</code> [[Ruby/Thread|المهمة الفرعية]] قيد التشغيل حاليًا، ويُجدوِل (schedules) [[Ruby/Thread|مهمة فرعية]] أخرى ليتم تشغيلها.
===[[Ruby/Thread/group| التابع group]]===
===[[Ruby/Thread/group|<code>group</code>]]===
يُعيد التابع <code>group</code> كائنا من النوع <code>[[Ruby/ThreadGroup|ThreadGroup]]</code>، والذي يحتوي [[Ruby/Thread|المهمة الفرعية]] المعطاة.
يُعيد <code>group</code> كائنا من النوع <code>[[Ruby/ThreadGroup|ThreadGroup]]</code>، والذي يحتوي [[Ruby/Thread|المهمة الفرعية]] المعطاة.
===[[Ruby/Thread/inspect| التابع inspect]]===
===[[Ruby/Thread/inspect|<code>inspect</code>]]===
يعيد <code>inspect</code> اسم ورقم تعريف وحالة <nowiki/>[[Ruby/Thread|المهمة الفرعية]] على هيئة سلسلة نصية.
يعيد <code>inspect</code> اسم ورقم تعريف وحالة <nowiki/>[[Ruby/Thread|المهمة الفرعية]] على هيئة سلسلة نصية.


===[[Ruby/Thread/join| التابع join]]===
===[[Ruby/Thread/join|<code>join</code>]]===
عند استدعاء التابع <code>join</code>، فسيتوقف تنفيذ [[Ruby/Thread|المهمة الفرعية]] المُستدعية (calling thread)، وسيقوم بتنفيذ [[Ruby/Thread|المهمة الفرعية]] التي استُدعي معها.
عند استدعاء <code>join</code>، فسيتوقف تنفيذ [[Ruby/Thread|المهمة الفرعية]] المُستدعية (calling thread)، وسيقوم بتنفيذ [[Ruby/Thread|المهمة الفرعية]] التي استُدعي معها.
===[[Ruby/Thread/key-3F| التابع key?‎]]===
===[[Ruby/Thread/key-3F|<code>key?‎</code>]]===
يُعيد التابع <code>key?‎</code> القيمة <code>true</code> إن كانت [[Ruby/String|السلسلة النصية]] أو الرمز المعطى موجودة على هيئة متغير محلي [[Ruby/Fiber|الليف]].
يُعيد <code>key?‎</code> القيمة <code>true</code> إن كانت [[Ruby/String|السلسلة النصية]] أو الرمز المعطى موجودة على هيئة متغير محلي [[Ruby/Fiber|الليف]].
===[[Ruby/Thread/keys| التابع keys]]===
===[[Ruby/Thread/keys|<code>keys</code>]]===
يُعيد التابع <code>keys</code> [[Ruby/Array|مصفوفة]] من أسماء المتغيرات محلية [[Ruby/Fiber|الليف]] (على هيئة رموز).
يُعيد <code>keys</code> [[Ruby/Array|مصفوفة]] من أسماء المتغيرات محلية [[Ruby/Fiber|الليف]] (على هيئة رموز).
===[[Ruby/Thread/kill| التابع kill]]===
===[[Ruby/Thread/kill|<code>kill</code>]]===
يؤدي التابع <code>kill</code> إلى إنهاء [[Ruby/Thread|المهمة الفرعية]]<nowiki/>المعطاة.
يؤدي <code>kill</code> إلى إنهاء [[Ruby/Thread|المهمة الفرعية]]<nowiki/>المعطاة.
===[[Ruby/Thread/name| التابع name]]===
===[[Ruby/Thread/name|<code>name</code>]]===
يعيد التابع <code>name</code> اسم [[Ruby/Thread|المهمة الفرعية]].
يعيد <code>name</code> اسم [[Ruby/Thread|المهمة الفرعية]].
===[[Ruby/Thread/name-3D| التابع name=]]===
===[[Ruby/Thread/name-3D|<code>name=</code>]]===
يعين التابع <code>name=‎</code> اسم معين لل[[Ruby/Thread|مهمة فرعية]] لروبي.
يعين <code>name=‎</code> اسم معين لل[[Ruby/Thread|مهمة فرعية]] لروبي.
===[[Ruby/Thread/pending interrupt-3F| التابع pending_interrupt?‎]]===
===[[Ruby/Thread/pending interrupt-3F|<code>pending_interrupt?‎</code>]]===
يتحقق مما إذا كان طابور الانتظار غير المتزامن فارغًا أم لا.
يتحقق مما إذا كان طابور الانتظار غير المتزامن فارغًا أم لا.
===[[Ruby/Thread/priority| التابع priority]]===
===[[Ruby/Thread/priority|<code>priority</code>]]===
يُعيد التابع <code>priority</code> أولوية [[Ruby/Thread|المهمة الفرعية]]
يُعيد <code>priority</code> أولوية [[Ruby/Thread|المهمة الفرعية]]
===[[Ruby/Thread/priority-3D| التابع priority=]]===
===[[Ruby/Thread/priority-3D|<code>priority=</code>]]===
يعين التابع <code>priority=‎</code> أولوية  [[Ruby/Thread|المهمة فرعية]] عند القيمة <code>integer.</code>
يعين <code>priority=‎</code> أولوية  [[Ruby/Thread|المهمة فرعية]] عند القيمة <code>integer.</code>
===[[Ruby/Thread/raise| التابع raise]]===
===[[Ruby/Thread/raise|<code>raise</code>]]===
يطلق التابع <code>raise</code> استثناء من [[Ruby/Thread|مهمة فرعية]] معينة.
يطلق <code>raise</code> استثناء من [[Ruby/Thread|مهمة فرعية]] معينة.
===[[Ruby/Thread/report on exception| التابع report_on_exception]]===
===[[Ruby/Thread/report on exception|<code>report_on_exception</code>]]===
يعيد التابع <code>report_on_exception</code> حالة "report on exception".
يعيد <code>report_on_exception</code> حالة "report on exception".
===[[Ruby/Thread/report on exception-3D| التابع report_on_exception=‎]]===
===[[Ruby/Thread/report on exception-3D|<code>report_on_exception=‎</code>]]===
يُعيد التابع <code>report_on_exception=</code> الحالة الجديدة.
يُعيد <code>report_on_exception=</code> الحالة الجديدة.
===[[Ruby/Thread/run| التابع run]]===
===[[Ruby/Thread/run|<code>run</code>]]===
يوقظ التابع <code>run</code> [[Ruby/Thread|المهمة الفرعية]]، مما يجعلها متاحة للجدولة.
يوقظ <code>run</code> [[Ruby/Thread|المهمة الفرعية]]، مما يجعلها متاحة للجدولة.
===[[Ruby/Thread/safe level| التابع safe_level]]===
===[[Ruby/Thread/safe level|<code>safe_level</code>]]===
يُعيد التابع <code>safe_level</code> المستوى الآمن لل[[Ruby/Thread|مهمة فرعية]].
يُعيد <code>safe_level</code> المستوى الآمن لل[[Ruby/Thread|مهمة فرعية]].
===[[Ruby/Thread/set trace func| التابع set_trace_func]]===
===[[Ruby/Thread/set trace func|<code>set_trace_func</code>]]===
يجعل التابع <code>set_trace_func</code> الوسيط المعطى <code>proc</code> معالجا للتعقب في [[Ruby/Thread|المهمة الفرعية]].
يجعل <code>set_trace_func</code> الوسيط المعطى <code>proc</code> معالجا للتعقب في [[Ruby/Thread|المهمة الفرعية]].
===[[Ruby/Thread/status| التابع status]]===
===[[Ruby/Thread/status|<code>status</code>]]===
يُعيد التابع <code>status</code> حالة  [[Ruby/Thread|المهمة الفرعية]].
يعيد <code>status</code> حالة  [[Ruby/Thread|المهمة الفرعية]].
===[[Ruby/Thread/stop-3F| التابع stop?‎]]===
===[[Ruby/Thread/stop-3F|<code>stop?‎</code>]]===
يُعيد التابع <code>stop?‎</code> القيمة <code>true</code> إن كانت [[Ruby/Thread|المهمة الفرعية]] ميتة أو نائمة.
يُعيد <code>stop?‎</code> القيمة <code>true</code> إن كانت [[Ruby/Thread|المهمة الفرعية]] ميتة أو نائمة.
===[[Ruby/Thread/terminate| التابع terminate]]===
===[[Ruby/Thread/terminate|<code>terminate</code>]]===
ينهي التابع <code>terminate</code> [[Ruby/Thread|المهمة الفرعية]] ويُجدوِل [[Ruby/Thread|مهمة فرعية]] أخرى ليتم تشغيلها.
ينهي <code>terminate</code> [[Ruby/Thread|المهمة الفرعية]] ويُجدوِل [[Ruby/Thread|مهمة فرعية]] أخرى ليتم تشغيلها.
===[[Ruby/Thread/thread variable-3F| التابع thread_variable?‎]]===
===[[Ruby/Thread/thread variable-3F|<code>thread_variable?‎</code>]]===
يُعيد التابع <code>thread_variable?‎</code> القيمة <code>true</code> إن كانت [[Ruby/String|السلسلة النصية]] (أو الرمز) موجودة كمتغير محلي [[Ruby/Thread|المهمة الفرعية]] (thread-local variable).
يُعيد <code>thread_variable?‎</code> القيمة <code>true</code> إن كانت [[Ruby/String|السلسلة النصية]] (أو الرمز) موجودة كمتغير محلي [[Ruby/Thread|المهمة الفرعية]] (thread-local variable).
===[[Ruby/Thread/thread variable get| التابع thread_variable_get]]===
===[[Ruby/Thread/thread variable get|<code>thread_variable_get</code>]]===
يُعيد التابع <code>thread_variable_get</code> قيمة المتغير المحلي في [[Ruby/Thread|المهمة الفرعية]] (thread local variable) الذي تم تعيينه.
يُعيد <code>thread_variable_get</code> قيمة المتغير المحلي في [[Ruby/Thread|المهمة الفرعية]] (thread local variable) الذي تم تعيينه.
===[[Ruby/Thread/thread variable set| التابع thread_variable_set]]===
===[[Ruby/Thread/thread variable set|<code>thread_variable_set</code>]]===
يعين التابع <code>thread_variable_set</code> المتغيرا المحلي في [[Ruby/Thread|المهمة الفرعية]] (thread local) ذو الاسم <code>key</code> ويعطيه القيمة <code>[[Ruby/Thread/value|value]]</code>
يعين <code>thread_variable_set</code> المتغيرا المحلي في [[Ruby/Thread|المهمة الفرعية]] (thread local) ذو الاسم <code>key</code> ويعطيه القيمة <code>[[Ruby/Thread/value|value]]</code>
===[[Ruby/Thread/thread variables| التابع thread_variables]]===
===[[Ruby/Thread/thread variables|<code>thread_variables</code>]]===
يُعيد التابع <code>thread_variables</code> [[Ruby/Array|مصفوفة]] من أسماء المتغيرات المحلية في [[Ruby/Thread|المهمة الفرعية]] (thread-local) (على شكل رموز).
يُعيد <code>thread_variables</code> [[Ruby/Array|مصفوفة]] من أسماء المتغيرات المحلية في [[Ruby/Thread|المهمة الفرعية]] (thread-local) (على شكل رموز).
===[[Ruby/Thread/to s| التابع to_s]]===
===[[Ruby/Thread/to s|<code>to_s</code>]]===
يعيد التابع <code>to_s</code> اسم و رقم تعريف وحالة [[Ruby/Thread|المهمة الفرعية]] على شكل [[Ruby/String|سلسلة نصية]].
يعيد <code>to_s</code> اسم و رقم تعريف وحالة [[Ruby/Thread|المهمة الفرعية]] على شكل [[Ruby/String|سلسلة نصية]].
===[[Ruby/Thread/value| التابع value]]===
===[[Ruby/Thread/value|<code>value</code>]]===
ينتظر التابع <code>value</code> اكتمال [[Ruby/Thread|المهمة الفرعية]] ، باستخدام <code>[[Ruby/Thread/join|join]]</code>، ثم يُعيد قيمتها.
ينتظر <code>value</code> اكتمال [[Ruby/Thread|المهمة الفرعية]] ، باستخدام <code>[[Ruby/Thread/join|join]]</code>، ثم يُعيد قيمتها.
===[[Ruby/Thread/wakeup| التابع wakeup]]===
===[[Ruby/Thread/wakeup|<code>wakeup</code>]]===
يجعل التابع <code>wakeup</code> [[Ruby/Thread|مهمة فرعية]] معينة متاحة للجدولة.
يجعل <code>wakeup</code> [[Ruby/Thread|مهمة فرعية]] معينة متاحة للجدولة.
==مصادر==
==مصادر==
*[http://ruby-doc.org/core-2.5.1/Thread.html قسم  الصنف Thread في توثيق روبي الرسمي.]
*[http://ruby-doc.org/core-2.5.1/Thread.html صفحة الصنف Thread في توثيق روبي الرسمي.]

مراجعة 12:51، 5 ديسمبر 2018

المهام الفرعية (Threads، وتدعى "الخيوط" أيضًا) هي الطريقة التي تنفذ بها روبي البرمجة المتزامنة (concurrent programming).

البرامج التي تتطلب تنفيذ عدة مهام فرعية يمكنها استخدام الصنف Thread. على سبيل المثال، يمكننا إنشاء مهمة فرعية جديدة منفصلة عن المهمة الرئيسية باستخدام new.

thr = Thread.new { puts "Whats the big deal" }

ثم يمكننا إيقاف تنفيذ المهمة الفرعية الرئيسية مؤقتًا إلى حين إنتهاء المهمة الفرعية خاصتنا باستخدام التابع join:

thr.join #=> "Whats the big deal"‎

في حال عدم استدعاء الت ابع join قبل انتهاء المهمة الرئيسية، فسيتم إنهاء جميع المهام الفرعية الأخرى، بما في ذلك المهمة الفرعية التي أنشأناها. بدلاً من ذلك، يمكنك استخدام مصفوفة للتعامل مع عدة مهام فرعية في وقت واحد كما في المثال التالي:

threads = []
threads << Thread.new { puts "Whats the big deal" }
threads << Thread.new { 3.times { puts "Threads are fun!" } }

بعد إنشاء عدد من المهام الفرعية، سننتظر إلى أن تنتهي جميعها بالتتابع.

threads.each { |thr| thr.join }

تهيئة المهام الفرعية

لإنشاء مهام فرعية جديدة، توفر روبي عدة توابع لذلك هي: new و start و fork. يجب تمرير كتلة مع كل هذه التوابع، وإلا سيُطلق الاستثناء ThreadError.

عند اشتقاق أصناف فرعية (subclasses) من Thread، فسيتم تجاهل التابع initialize الخاص بصنفك الفرعي من قبل التوابع start و fork. لذلك تأكد من استدعاء المتغير super في التابع initialize خاصتك.

إنهاء مهمة الفرعية

توفر روبي مجموعة متنوعة من الطرق لإنهاء المهام الفرعية. ينهي (أو يقتل) التابع kill مثلًا المهمة الفرعية المعطاة:

thr = Thread.new { ... }
Thread.kill(thr) # sends exit() to thr‎

أو يمكنك استخدام تابع النسخة exit، أو أحد الأسماء البديلة له وهي kill و terminate.

thr.exit

حالة مهمة الفرعية

توفر روبي عددًا من من توابع النسخة (instance methods) لاستخلاص حالة مهمة فرعية معينة. للحصول على سلسلة نصية تحتوي حالة المهمة الفرعية الحالية، استخدم التابع status:

thr = Thread.new { sleep }
thr.status # => "sleep"
thr.exit
thr.status # => false‎

يمكنك أيضًا استخدام التابع alive?‎ للتحقق مما إذا كانت المهمة الفرعية قيد التشغيل أو نائمة، أو التابع stop?‎ للتحقق مما إذا كانت المهمة الفرعية ميتة أو نائمة.

متغيرات ونطاق مهمة الفرعية

نظرًا لكون المهام الفرعية تُنشأ بواسطة الكتل، فستُطبَّق القواعد نفسها على كتل روبي الأخرى فيما يتعلق بنطاق (scope) المتغيرات. المتغيرات المحلية التي تم إنشاؤها داخل هذه الكتلة لا يمكن الوصول إليها إلا من داخل هذه المهمة الفرعية.

الألياف المحلية مقابل الخيوط المحلية

يحتوي كل ليف (fiber) على نطاق خاص به لتخزين العناصر المعيّنة من المعامل []. عندما تعيِّن ليفًا محليًّا (fiber-local)، فلن يمكن الوصول إليه إلا من داخل ذلك الليف. المثال التالي يوضح ذلك:

Thread.new {
  Thread.current[:foo] = "bar"
  Fiber.new {
    p Thread.current[:foo] # => nil
  }.resume
}.join

يستخدم هذا المثال معامل الفهرسة [] لأجل الاستخلاص، ويستخدم معامل التعيين =[] لأجل تعيين ليف محلي (fiber-locals)؛ يمكنك أيضًا استخدام ال$تابع keys لإنشاء قائمة بالألياف المحلية لمهمة فرعية معينة، أو التابع key?‎ للتحقق من وجود ألياف محلية. يمكن الوصول إلى المتغيرات المحلية في المهمة الفرعية (thread-locals) من أي مكان في نطاق تلك المهمة. إليك المثال التالي:

Thread.new{
  Thread.current.thread_variable_set(:foo, 1)
  p Thread.current.thread_variable_get(:foo) # => 1
  Fiber.new{
    Thread.current.thread_variable_set(:foo, 2)
    p Thread.current.thread_variable_get(:foo) # => 2
  }.resume
  p Thread.current.thread_variable_get(:foo)   # => 2
}.join

يمكنك أن ترى أن المتغير ‎:foo محلي المهمة الفرعية قد وصل إلى نطاق الليف، ثم تم تغييره إلى القيمة 2 في نهاية المهمة الفرعية.

هذا المثال يستخدم التابع thread_variable_set لإنشاء مهمة فرعية جديدة، ويستخدم thread_variable_get للرجوع إليها.

يمكن أيضًا استخدام التابع thread_variables لإنشاء قائمة بجميع المتغيرات المحلية في مهمة فرعية (thread-locals)، والتابع thread_variable?‎ للتحقق من وجود متغير محلي معين في مهمة فرعية.

معالجة الاستثناء Exception

يمكن لأي مهمة فرعية إطلاق استثناء باستخدام تابع النسخة raise، والذي يعمل بطريقة مشابهة للتابع Kernel.raise.

من الجدير بالذكر أنّ الاستثناءات التي تُطلق من أي مهمة الفرعية، باستثناء الرئيسية (main thread)، التي تعتمد على abort_on_exception. قيمة هذا الخيار الافتراضية هي false، مما يعني أن أي استثناء غير مُعالَج سيؤدي إلى إنهاء المهمة الفرعية بصمت عند الانتظار سواءً من join أو من value. يمكنك تغيير هذا الإعداد الافتراضي عبر استدعاء abort_on_exception= true ، أو من خلال إعطاء DEBUG القيمة true.

مع إضافة تابع الصنف handle_interrupt، يمكنك الآن معالجة الاستثناءات بشكل غير متزامن بالمهام الفرعية.

الجدولة (Scheduling)

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

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

يمكنك أيضًا استخدام التابع pass، والذي يحاول تمرير التنفيذ إلى مهمة فرعية أخرى؛ مسألة استبدال المهمة الفرعية قيد التشغيل تتعلق بنظام التشغيل المستخدم. وينطبق الأمر ذاته على التابع priority، والذي يتيح لك الطلب من مُجدوِل المهام الفرعية (thread scheduler) إعطاء الأسبقية لمهام فرعية معينة عند التنفيذ. يعتمد هذا التابع أيضًا على نظام التشغيل، وقد يُتجاهَل في بعض الأنظمة.

توابع الصنف العامة

DEBUG

يُعيد مستوى التصحيح في المهمة الفرعية (thread debug level).

DEBUG=‎

يعيّن عند استدعائه بالشكل DEBUG = num قيمة مستوى تصحيح المهمة الفرعية(thread debug level) إلى القيمة num.

abort_on_exception

يُعيد حالة الشرط العام "المقاطعة عند حدوث استثناء؟" (abort on exception). 

abort_on_exception=‎

يضبط عند استدعائه بالشكل abort_on_exception= boolean حالة الشرط العام "المقاطعة عند حدوث استثناء؟" (abort on exception) إلى القيمة المنطقية boolean.

current

يُعيد المهمة الفرعية المُنفّذة حاليًّا.

exclusive

يغلف الكتلة المعطاة في دالة الآلة الافتراضية العامة (VM-global)‏Mutex.synchronize، ثم يعيد قيمة الكتلة.

exit

ينهي المهمة الفرعية قيد التشغيل، ويُجدول مهمة فرعية أخرى ليتم تشغيلها.

fork

ينشئ عملية فرعية جديدة بشكل مكافئ للتابع new.

handle_interrupt

يغير توقيت المقاطعة غير المتزامنة (asynchronous interrupt timing).

kill

ينهي المهمة الفرعية المعطاة.

list

يُعيد مصفوفة من المهام الفرعية العاملة أو المتوقفة.

main

يُعيد المهمة الفرعية الرئيسية.

new

ينشئ مهمة فرعية جديدة تقوم بتنفيذ الكتلة المعطاة.

pass

يعطي إلى مُجدوِل المهمة الفرعية تلميحًا لتمرير التنفيذ إلى مهمة فرعية أخرى.

pending_interrupt?‎

يتحقق مما إذا كان طابور الانتظار غير المتزامن فارغًا أم لا.

report_on_exception

يعيد حالة "التبليغ عند الاستثناء" (report on exception). 

report_on_exception=‎

يضبط عند استدعائه بالشكل report_on_exception= boolean‎ حالة "التبليغ عند الاستثناء" (report on exception).

start

يشبه التابع new بشكل أساسي إلا أنه عند اشتقاق صنف فرعي (subclassed) من Thread، فإنَّ استدعاء start في ذلك الصنف الفرعي لن يستدعي تابع الصنف الفرعيinitialize.

stop

يوقف تنفيذ المهمة الفرعية الحالية، ويضعها في حالة "نوم" (sleep)، ويُجدوٍل (schedules) تنفيذ مهمة فرعية أخرى.

تزوابع النسخة العامة (Public Instance Methods)

[]

مرجع الخصائص (Attribute Reference) - يُعيد قيمة متغير الليف المحلي fiber-local variable

[]=

معامل تعيين الخاصيات (Attribute Assignment) - يعيّن أو ينشئ قيمة متغير محلي الليف، باستخدام إما رمز أو سلسلة نصية.

abort_on_exception

يُعيد abort_on_exception حالة الشرط "abort on exception".

abort_on_exception=‎

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

add_trace_func

يضيف add_trace_func الوسيط المعطى proc كمعالج للتعقب (tracing).

alive?‎

يُعيد alive?‎ القيمة true إن كانت المهمة الفرعية التي استُدعي معها قيد التشغيل أو نائمة.

backtrace

يُعيد backtrace المتعقب (backtrace) الحالي للمهمة فرعية.

backtrace_locations

يُعيد backtrace_locations مكدس التنفيذ (execution stack) الخاص بالمهمة الفرعيةمصفوفة تحتوي على كائنات تعقب (backtrace location objects).

exit

ينهي exit المهمة الفرعية قيد التشغيل حاليًا، ويُجدوِل (schedules) مهمة فرعية أخرى ليتم تشغيلها.

group

يُعيد group كائنا من النوع ThreadGroup، والذي يحتوي المهمة الفرعية المعطاة.

inspect

يعيد inspect اسم ورقم تعريف وحالة المهمة الفرعية على هيئة سلسلة نصية.

join

عند استدعاء join، فسيتوقف تنفيذ المهمة الفرعية المُستدعية (calling thread)، وسيقوم بتنفيذ المهمة الفرعية التي استُدعي معها.

key?‎

يُعيد key?‎ القيمة true إن كانت السلسلة النصية أو الرمز المعطى موجودة على هيئة متغير محلي الليف.

keys

يُعيد keys مصفوفة من أسماء المتغيرات محلية الليف (على هيئة رموز).

kill

يؤدي kill إلى إنهاء المهمة الفرعيةالمعطاة.

name

يعيد name اسم المهمة الفرعية.

name=

يعين name=‎ اسم معين للمهمة فرعية لروبي.

pending_interrupt?‎

يتحقق مما إذا كان طابور الانتظار غير المتزامن فارغًا أم لا.

priority

يُعيد priority أولوية المهمة الفرعية

priority=

يعين priority=‎ أولوية المهمة فرعية عند القيمة integer.

raise

يطلق raise استثناء من مهمة فرعية معينة.

report_on_exception

يعيد report_on_exception حالة "report on exception".

report_on_exception=‎

يُعيد report_on_exception= الحالة الجديدة.

run

يوقظ run المهمة الفرعية، مما يجعلها متاحة للجدولة.

safe_level

يُعيد safe_level المستوى الآمن للمهمة فرعية.

set_trace_func

يجعل set_trace_func الوسيط المعطى proc معالجا للتعقب في المهمة الفرعية.

status

يعيد status حالة المهمة الفرعية.

stop?‎

يُعيد stop?‎ القيمة true إن كانت المهمة الفرعية ميتة أو نائمة.

terminate

ينهي terminate المهمة الفرعية ويُجدوِل مهمة فرعية أخرى ليتم تشغيلها.

thread_variable?‎

يُعيد thread_variable?‎ القيمة true إن كانت السلسلة النصية (أو الرمز) موجودة كمتغير محلي المهمة الفرعية (thread-local variable).

thread_variable_get

يُعيد thread_variable_get قيمة المتغير المحلي في المهمة الفرعية (thread local variable) الذي تم تعيينه.

thread_variable_set

يعين thread_variable_set المتغيرا المحلي في المهمة الفرعية (thread local) ذو الاسم key ويعطيه القيمة value

thread_variables

يُعيد thread_variables مصفوفة من أسماء المتغيرات المحلية في المهمة الفرعية (thread-local) (على شكل رموز).

to_s

يعيد to_s اسم و رقم تعريف وحالة المهمة الفرعية على شكل سلسلة نصية.

value

ينتظر value اكتمال المهمة الفرعية ، باستخدام join، ثم يُعيد قيمتها.

wakeup

يجعل wakeup مهمة فرعية معينة متاحة للجدولة.

مصادر