الفرق بين المراجعتين لصفحة: «Ruby/Thread»
لا ملخص تعديل |
لا ملخص تعديل |
||
سطر 6: | سطر 6: | ||
البرامج التي تتطلب تنفيذ عدة مهام فرعية يمكنها استخدام الصنف <code>Thread</code>. | البرامج التي تتطلب تنفيذ عدة مهام فرعية يمكنها استخدام الصنف <code>Thread</code>. | ||
على سبيل المثال، يمكننا إنشاء مهمة فرعية جديدة منفصلة عن المهمة الرئيسية باستخدام <code>[[Ruby/Thread/new|new]]</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>]] قبل انتهاء المهمة الرئيسية ، فسيتم إنهاء جميع المهام الفرعية الأخرى، بما في ذلك المهمة الفرعية التي أنشأناها. | ||
<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|مصفوفة]] للتعامل مع عدة مهام فرعية في وقت واحد ، كما في المثال التالي: | بدلاً من ذلك، يمكنك استخدام [[Ruby/Array|مصفوفة]] للتعامل مع عدة مهام فرعية في وقت واحد ، كما في المثال التالي:<syntaxhighlight lang="ruby">threads = [] | ||
<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> | threads << Thread.new { 3.times { puts "Threads are fun!" } }</syntaxhighlight>بعد إنشاء عدد من المهام الفرعية، سننتظر أن تنتهي جميعها بالتتابع.<syntaxhighlight lang="ruby">threads.each { |thr| thr.join }</syntaxhighlight> | ||
بعد إنشاء عدد من المهام الفرعية، سننتظر أن تنتهي جميعها بالتتابع. | ==تهيئة المهام الفرعية (Thread initialization)== | ||
<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)== | |||
== إنهاء المهمة الفرعية (Thread termination) == | |||
توفر روبي مجموعة متنوعة من الطرق لإنهاء المهام الفرعية. | توفر روبي مجموعة متنوعة من الطرق لإنهاء المهام الفرعية. | ||
يقوم التابع <code>[[Ruby/Thread/kill|kill]]</code> بإنهاء المهمة الفرعية المعطاة: | يقوم التابع <code>[[Ruby/Thread/kill|kill]]</code> بإنهاء المهمة الفرعية المعطاة:<syntaxhighlight lang="ruby">thr = Thread.new { ... } | ||
<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> | ||
Thread.kill(thr) # sends exit() to thr</syntaxhighlight> | ==حالة المهمة الفرعية (Thread status)== | ||
أو يمكنك استخدام تابع النسخة <code>[[Ruby/Thread/exit|exit]]</code>، أو أحد مرادفيه <code>[[Ruby/Thread/kill|kill]]</code> و <code>[[Ruby/Thread/terminate|terminate]]</code>. | توفر روبي عددا من من توابع النسخ (instance methods) لاستخلاص حالة مهمة فرعية معينة. للحصول على [[Ruby/String|سلسلة نصية]] تحتوي حالة المهمة الفرعية الحالية استخدم التابع <code>[[Ruby/Thread/status|status]]</code>:<syntaxhighlight lang="ruby">thr = Thread.new { sleep } | ||
<syntaxhighlight lang="ruby">thr.exit</syntaxhighlight> | |||
== حالة المهمة الفرعية (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> | thr.status # => false</syntaxhighlight>يمكنك أيضًا استخدام <code>[[Ruby/Thread/alive-3F|alive?]]</code> للتحقق مما إذا كانت المهمة الفرعية قيد التشغيل أو نائمة، أو التابع <code>[[Ruby/Thread/stop-3F|stop?]]</code> للتحقق مما إذا كانت المهمة الفرعية ميتة أو نائمة. | ||
يمكنك أيضًا استخدام <code>[[Ruby/Thread/alive-3F|alive?]]</code> للتحقق مما إذا كانت المهمة الفرعية قيد التشغيل أو نائمة، أو التابع <code>[[Ruby/Thread/stop-3F|stop?]]</code> للتحقق مما إذا كانت المهمة الفرعية ميتة أو نائمة. | ==متغيرات ونطاق المهمة الفرعية (Thread variables and scope)== | ||
== متغيرات ونطاق المهمة الفرعية (Thread variables and scope) == | |||
نظرًا لكون المهام الفرعية تُنشأ بواسطة الكتل، فستنطبق القواعد نفسها على كتل روبي الأخرى فيما يتعلق بنطاق (scope) المتغيرات. المتغيرات المحلية التي تم إنشاؤها داخل هذه الكتلة لا يمكن الوصول إليها إلا من داخل هذه المهمة الفرعية. | نظرًا لكون المهام الفرعية تُنشأ بواسطة الكتل، فستنطبق القواعد نفسها على كتل روبي الأخرى فيما يتعلق بنطاق (scope) المتغيرات. المتغيرات المحلية التي تم إنشاؤها داخل هذه الكتلة لا يمكن الوصول إليها إلا من داخل هذه المهمة الفرعية. | ||
==المتغيرات محلية-الألياف مقابل المتغيرات محلية المهام الفرعية (Fiber-local vs. Thread-local)== | |||
== المتغيرات محلية-الألياف مقابل المتغيرات محلية المهام الفرعية (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> | }.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|الليف]]. | ||
يستخدم هذا المثال معامل الفهرسة <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|الليف]]. | |||
يمكن الوصول إلى المتغيرات المحلية في المهمة الفرعية (thread-locals) من أي مكان في نطاق تلك المهمة. في المثال التالي: | يمكن الوصول إلى المتغيرات المحلية في المهمة الفرعية (thread-locals) من أي مكان في نطاق تلك المهمة. في المثال التالي:<syntaxhighlight lang="ruby">Thread.new{ | ||
<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 | ||
سطر 63: | سطر 43: | ||
}.resume | }.resume | ||
p Thread.current.thread_variable_get(:foo) # => 2 | p Thread.current.thread_variable_get(:foo) # => 2 | ||
}.join</syntaxhighlight> | }.join</syntaxhighlight>يمكنك أن ترى أن المتغير <code>:foo</code> محلي المهمة الفرعية قد وصل إلى نطاق الل[[Ruby/Fiber|يف]]، ثم تم تغييره إلى القيمة <code>2</code> في نهاية المهمة الفرعية. | ||
يمكنك أن ترى أن المتغير <code>:foo</code> محلي المهمة الفرعية قد وصل إلى نطاق الل[[Ruby/Fiber|يف]]، ثم تم تغييره إلى القيمة <code>2</code> في نهاية المهمة الفرعية | |||
هذا المثال يستخدم التابع <code>[[Ruby/Thread/thread variable set|thread_variable_set]]</code> لإنشاء مهمة فرعية جديدة، ويستخدم <code>[[Ruby/Thread/thread variable get|thread_variable_get]]</code> للرجوع إليها. | |||
== معالجة الاستثناء<code>Exception</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/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/ | من الجدير بالذكر أنّ الاستثناءات التي تُطلق من أي مهمة الفرعية، باستثناء الرئيسية (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>. | ||
مع إضافة تابع الصنف <code>[[Ruby/Thread/ | مع إضافة تابع الصنف <code>[[Ruby/Thread/handle interrupt|handle_interrupt]]</code> ، يمكنك الآن معالجة الاستثناءات بشكل غير متزامن بالمهام الفرعية. | ||
==الجدولة (Scheduling)== | |||
== الجدولة (Scheduling) == | |||
توفر روبي عدة وسائل لجدولة المهام الفرعية في البرنامج. | توفر روبي عدة وسائل لجدولة المهام الفرعية في البرنامج. | ||
الطريقة الأولى هي باستخدام تابع الصنف <code>[[Ruby/Thread/stop| | الطريقة الأولى هي باستخدام تابع الصنف <code>[[Ruby/Thread/stop|stop]]</code>، لوضع المهمة الفرعية الحالية في حالة نوم، وجدولة عملية تنفيذ مهمة فرعية أخرى. | ||
بمجرد أن تصبح المهمة الفرعية في حالة نوم، يمكنك استخدام تابع النسخ <code>[[Ruby/Thread/wakeup|wakeup]]</code> | بمجرد أن تصبح المهمة الفرعية في حالة نوم، يمكنك استخدام تابع النسخ <code>[[Ruby/Thread/wakeup|wakeup]]</code> لجعلها متاحة للجدولة. | ||
يمكنك أيضًا استخدام التابع <code>[[Ruby/Thread/pass| | يمكنك أيضًا استخدام التابع <code>[[Ruby/Thread/pass|pass]]</code>، والذي يحاول تمرير التنفيذ إلى مهمة فرعية أخرى، مسألة استبدال المهمة الفرعية قيد التشغيل تتعلق بنظام التشغيل المستخدم. وينطبق الأمر ذاته على التابع <code>[[Ruby/Thread/priority|priority]]</code>، والذي يتيح لك الطلب من مُجدوِل المهام الفرعية (thread scheduler) إعطاء الأسبقية لمهام فرعية معينة عند التنفيذ. يعتمد هذا التابع أيضًا على نظام التشغيل، وقد يُتجاهل في بعض الأنظمة. | ||
==توابع الصنف العامة (Public Class Methods)== | ==توابع الصنف العامة (Public Class Methods)== | ||
===[[Ruby/Thread/DEBUG | التابع DEBUG]]=== | ===[[Ruby/Thread/DEBUG| التابع DEBUG]]=== | ||
يُعيد التابع <code>DEBUG</code> مستوى التصحيح في [[Ruby/Thread|المهمة الفرعية]] (thread debug level) | يُعيد التابع <code>DEBUG</code> مستوى التصحيح في [[Ruby/Thread|المهمة الفرعية]] (thread debug level). | ||
===[[Ruby/Thread/DEBUG-3D | التابع DEBUG=]]=== | ===[[Ruby/Thread/DEBUG-3D| التابع DEBUG=]]=== | ||
يعيّن التابع <code>DEBUG=</code> مستوى تصحيح [[Ruby/Thread|المهمة الفرعية]] (thread debug level). | يعيّن التابع <code>DEBUG=</code> مستوى تصحيح [[Ruby/Thread|المهمة الفرعية]] (thread debug level). م | ||
===[[Ruby/Thread/ | ===[[Ruby/Thread/abort on exception| التابع abort_on_exception]]=== | ||
يُعيد التابع <code>abort_on_exception</code> حالة الشرط العام "abort on exception". | يُعيد التابع <code>abort_on_exception</code> حالة الشرط العام "abort on exception". | ||
===[[Ruby/Thread/ | ===[[Ruby/Thread/abort on exception-3D| التابع abort_on_exception=]]=== | ||
عند إعطائه القيمة <code>true</code>، فأي [[Ruby/Thread|مهمة فرعية]] توقف بواسطة استثناء، سيتم إطلاق ذلك الاستثناء مجددا في [[Ruby/Thread|المهمة الفرعية]] الرئيسية (main thread) | عند إعطائه القيمة <code>true</code>، فأي [[Ruby/Thread|مهمة فرعية]] توقف بواسطة استثناء، سيتم إطلاق ذلك الاستثناء مجددا في [[Ruby/Thread|المهمة الفرعية]] الرئيسية (main thread). | ||
===[[Ruby/Thread/current | التابع current]]=== | ===[[Ruby/Thread/current| التابع current]]=== | ||
يُعيد التابع <code>current</code> [[Ruby/Thread|المهمة الفرعية]] المُنفّذة حاليا. | يُعيد التابع <code>current</code> [[Ruby/Thread|المهمة الفرعية]] المُنفّذة حاليا. | ||
===[[Ruby/Thread/exclusive | التابع exclusive]]=== | ===[[Ruby/Thread/exclusive| التابع exclusive]]=== | ||
يغلف التابع <code>exclusive</code> الكتلة المعطاة في دالة الآلة الافتراضية العامة (VM-global) <code>[[Ruby/Mutex/synchronize|Mutex#synchronize | يغلف التابع <code>exclusive</code> الكتلة المعطاة في دالة الآلة الافتراضية العامة (VM-global) <code>[[Ruby/Mutex/synchronize|Mutex#synchronize]]</code> . | ||
===[[Ruby/Thread/exit | التابع exit]]=== | ===[[Ruby/Thread/exit| التابع exit]]=== | ||
ينهي التابع <code>exit</code> [[Ruby/Thread|المهمة الفرعية]] قيد التشغيل، ويُجدول [[Ruby/Thread|مهمة فرعية]] أخرى ليتم تشغيلها. | ينهي التابع <code>exit</code> [[Ruby/Thread|المهمة الفرعية]] قيد التشغيل، ويُجدول [[Ruby/Thread|مهمة فرعية]] أخرى ليتم تشغيلها. | ||
===[[Ruby/Thread/fork | التابع fork]]=== | ===[[Ruby/Thread/fork| التابع fork]]=== | ||
التابع <code>fork</code> مكافئ للتابع <code>new</code>. | |||
===[[Ruby/Thread/ | ===[[Ruby/Thread/handle interrupt| التابع handle_interrupt]]=== | ||
يغير التابع <code>handle_interrupt</code> توقيت | يغير التابع <code>handle_interrupt</code> توقيت التوقيف غير المتزامن (asynchronous interrupt timing). | ||
===[[Ruby/Thread/kill | التابع kill]]=== | ===[[Ruby/Thread/kill| التابع kill]]=== | ||
بقوم التابع <code>kill</code> بإنهاء | بقوم التابع <code>kill</code> بإنهاء المهمة الفرعية المعطاة. | ||
===[[Ruby/Thread/list | التابع list]]=== | ===[[Ruby/Thread/list| التابع list]]=== | ||
يُعيد التابع <code>list</code> [[Ruby/Array|مصفوفة]] من [[Ruby/Thread| | يُعيد التابع <code>list</code> [[Ruby/Array|مصفوفة]] من [[Ruby/Thread|المهام الفرعية]] المشتغلة أو المتوقفة. | ||
===[[Ruby/Thread/main | التابع main]]=== | ===[[Ruby/Thread/main| التابع main]]=== | ||
يُعيد التابع <code>main</code> [[Ruby/Thread|المهمة الفرعية]] الرئيسية. | يُعيد التابع <code>main</code> [[Ruby/Thread|المهمة الفرعية]] الرئيسية. | ||
===[[Ruby/Thread/new | التابع new]]=== | ===[[Ruby/Thread/new| التابع new]]=== | ||
ينشئ التابع <code>new</code> [[Ruby/Thread|مهمة فرعية]] جديدة تقوم بتنفيذ الكتلة المعطاة. | ينشئ التابع <code>new</code> [[Ruby/Thread|مهمة فرعية]] جديدة تقوم بتنفيذ الكتلة المعطاة. | ||
===[[Ruby/Thread/pass | التابع pass]]=== | ===[[Ruby/Thread/pass| التابع pass]]=== | ||
يعطي التابع <code>pass</code> إلى مُجدوِل [[Ruby/Thread|المهمة الفرعية]] تلميحًا لتمرير التنفيذ إلى [[Ruby/Thread|مهمة فرعية]] أخرى | يعطي التابع <code>pass</code> إلى مُجدوِل [[Ruby/Thread|المهمة الفرعية]] تلميحًا لتمرير التنفيذ إلى [[Ruby/Thread|مهمة فرعية]] أخرى. | ||
===[[Ruby/Thread/ | ===[[Ruby/Thread/pending interrupt-3F| التابع pending_interrupt?]]=== | ||
يتحقق التابع <code>pending_interrupt?</code> مما إذا كان طابور الانتظار غير المتزامن فارغًا أم لا. | يتحقق التابع <code>pending_interrupt?</code> مما إذا كان طابور الانتظار غير المتزامن فارغًا أم لا. | ||
===[[Ruby/Thread/ | ===[[Ruby/Thread/report on exception| التابع report_on_exception]]=== | ||
يعيد التابع <code>report_on_exception</code> حالة report on exception". | يعيد التابع <code>report_on_exception</code> حالة report on exception". | ||
===[[Ruby/Thread/ | ===[[Ruby/Thread/report on exception-3D| التابع report_on_exception=]]=== | ||
يُعيد التابع <code>report_on_exception=</code> الحالة الجديدة. | يُعيد التابع <code>report_on_exception=</code> الحالة الجديدة. | ||
===[[Ruby/Thread/start | التابع start]]=== | ===[[Ruby/Thread/start| التابع start]]=== | ||
يشبه التابع <code>start</code> التابع <code>[[Ruby/Thread/new|new]]</code>. | |||
===[[Ruby/Thread/stop | التابع stop]]=== | ===[[Ruby/Thread/stop| التابع stop]]=== | ||
يوقف التابع <code>stop</code> تنفيذ [[Ruby/Thread|المهمة الفرعية]] الحالية، | يوقف التابع <code>stop</code> تنفيذ [[Ruby/Thread|المهمة الفرعية]] الحالية، | ||
===[[Ruby/Thread/ | |||
مرجع الخصائص (Attribute Reference) - يُعيد قيمة متغير [[Ruby/Fiber|الليف]] المحلي fiber-local variable | == تزوابع النسخة العامة (Public Instance Methods) == | ||
===[[Ruby/Thread/ | |||
===[[Ruby/Thread/index operator| التابع []]]=== | |||
مرجع الخصائص (Attribute Reference) - يُعيد قيمة متغير [[Ruby/Fiber|الليف]] المحلي fiber-local variable | |||
===[[Ruby/Thread/index operator-3D| التابع []=]]=== | |||
معامل تعيين الخاصيات (Attribute Assignment) - يعيّن أو ينشئ قيمة متغير محلي [[Ruby/Fiber|الليف]]، باستخدام إما رمز أو [[Ruby/String|سلسلة نصية]]. | معامل تعيين الخاصيات (Attribute Assignment) - يعيّن أو ينشئ قيمة متغير محلي [[Ruby/Fiber|الليف]]، باستخدام إما رمز أو [[Ruby/String|سلسلة نصية]]. | ||
===[[Ruby/Thread/ | ===[[Ruby/Thread/abort on exception| التابع abort_on_exception]]=== | ||
يُعيد التابع <code>abort_on_exception</code> حالة الشرط "abort on exception". | يُعيد التابع <code>abort_on_exception</code> حالة الشرط "abort on exception". | ||
===[[Ruby/Thread/ | ===[[Ruby/Thread/abort on exception-3D| التابع abort_on_exception=]]=== | ||
عند إعطائه القيمة <code>true</code>، إذا تم إيقاف أي [[Ruby/Thread|مهمة فرعية]] بواسطة استثناء، فسيطلق ذلك الاستثناء مجددا في [[Ruby/Thread|المهمة الفرعية]] الرئيسية | عند إعطائه القيمة <code>true</code>، إذا تم إيقاف أي [[Ruby/Thread|مهمة فرعية]] بواسطة استثناء، فسيطلق ذلك الاستثناء مجددا في [[Ruby/Thread|المهمة الفرعية]] الرئيسية. | ||
===[[Ruby/Thread/ | ===[[Ruby/Thread/add trace func| التابع add_trace_func]]=== | ||
يضيف التابع <code>add_trace_func</code> الوسيط المعطى <code>proc</code> | يضيف التابع <code>add_trace_func</code> الوسيط المعطى <code>proc</code> كمعالج للتعقب (tracing). | ||
===[[Ruby/Thread/alive-3F | التابع alive?]]=== | ===[[Ruby/Thread/alive-3F| التابع alive?]]=== | ||
يُعيد التابع <code>alive?</code> القيمة <code>true</code> إن كانت [[Ruby/Thread|المهمة الفرعية]] التي استُدعي معها | يُعيد التابع <code>alive?</code> القيمة <code>true</code> إن كانت [[Ruby/Thread|المهمة الفرعية]] التي استُدعي معها قيد التشغيل أو نائمة. | ||
===[[Ruby/Thread/backtrace | التابع backtrace]]=== | ===[[Ruby/Thread/backtrace| التابع backtrace]]=== | ||
يُعيد التابع <code>backtrace</code> | يُعيد التابع <code>backtrace</code> المتعقب (backtrace) الحالي لل[[Ruby/Thread|مهمة فرعية]]. | ||
===[[Ruby/Thread/ | ===[[Ruby/Thread/backtrace locations| التابع backtrace_locations]]=== | ||
يُعيد التابع <code>backtrace_locations</code> مكدس التنفيذ (execution stack) الخاص ب[[Ruby/Thread|المهمة الفرعية]] — [[Ruby/Array|مصفوفة]] تحتوي على كائنات تعقب | يُعيد التابع <code>backtrace_locations</code> مكدس التنفيذ (execution stack) الخاص ب[[Ruby/Thread|المهمة الفرعية]] — [[Ruby/Array|مصفوفة]] تحتوي على كائنات تعقب (backtrace location objects). | ||
===[[Ruby/Thread/exit | التابع exit]]=== | ===[[Ruby/Thread/exit| التابع exit]]=== | ||
ينهي التابع <code>exit</code> [[Ruby/Thread|المهمة الفرعية]] قيد التشغيل حاليًا، ويُجدوِل (schedules) [[Ruby/Thread|مهمة فرعية]] أخرى ليتم تشغيلها. | ينهي التابع <code>exit</code> [[Ruby/Thread|المهمة الفرعية]] قيد التشغيل حاليًا، ويُجدوِل (schedules) [[Ruby/Thread|مهمة فرعية]] أخرى ليتم تشغيلها. | ||
===[[Ruby/Thread/group| التابع group]]=== | |||
يُعيد التابع <code>group</code> كائنا من النوع <code>[[Ruby/ThreadGroup|ThreadGroup]]</code>، والذي يحتوي [[Ruby/Thread|المهمة الفرعية]] المعطاة. | |||
===[[Ruby/Thread/group | التابع group]]=== | ===[[Ruby/Thread/inspect| التابع inspect]]=== | ||
يُعيد التابع <code>group</code> كائنا من النوع <code>[[Ruby/ThreadGroup|ThreadGroup]]</code>، والذي يحتوي [[Ruby/Thread|المهمة الفرعية]] | يعيد <code>inspect</code> اسم ورقم تعريف وحالة <nowiki/>[[Ruby/Thread|المهمة الفرعية]] على هيئة سلسلة نصية. | ||
===[[Ruby/Thread/inspect | التابع inspect]]=== | |||
===[[Ruby/Thread/join | التابع join]]=== | ===[[Ruby/Thread/join| التابع join]]=== | ||
عند استدعاء التابع <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| التابع key?]]=== | ||
يُعيد التابع <code>key?</code> القيمة <code>true</code> إن كانت [[Ruby/String|السلسلة النصية]] أو الرمز المعطى | يُعيد التابع <code>key?</code> القيمة <code>true</code> إن كانت [[Ruby/String|السلسلة النصية]] أو الرمز المعطى موجودة على هيئة متغير محلي [[Ruby/Fiber|الليف]]. | ||
===[[Ruby/Thread/keys | التابع keys]]=== | ===[[Ruby/Thread/keys| التابع keys]]=== | ||
يُعيد التابع <code>keys</code> [[Ruby/Array|مصفوفة]] من أسماء المتغيرات محلية [[Ruby/Fiber|الليف]] (على هيئة رموز). | يُعيد التابع <code>keys</code> [[Ruby/Array|مصفوفة]] من أسماء المتغيرات محلية [[Ruby/Fiber|الليف]] (على هيئة رموز). | ||
===[[Ruby/Thread/kill | التابع kill]]=== | ===[[Ruby/Thread/kill| التابع kill]]=== | ||
يؤدي التابع <code>kill</code> إلى إنهاء | يؤدي التابع <code>kill</code> إلى إنهاء [[Ruby/Thread|المهمة الفرعية]]<nowiki/>المعطاة. | ||
===[[Ruby/Thread/name | التابع name]]=== | ===[[Ruby/Thread/name| التابع name]]=== | ||
يعيد التابع <code>name</code> اسم [[Ruby/Thread|المهمة الفرعية]]. | يعيد التابع <code>name</code> اسم [[Ruby/Thread|المهمة الفرعية]]. | ||
===[[Ruby/Thread/name-3D | التابع name=]]=== | ===[[Ruby/Thread/name-3D| التابع name=]]=== | ||
يعين التابع <code>name=</code> اسم معين لل[[Ruby/Thread|مهمة فرعية]] لروبي | يعين التابع <code>name=</code> اسم معين لل[[Ruby/Thread|مهمة فرعية]] لروبي. | ||
===[[Ruby/Thread/ | ===[[Ruby/Thread/pending interrupt-3F| التابع pending_interrupt?]]=== | ||
يتحقق مما إذا كان طابور الانتظار غير المتزامن فارغًا أم لا. | يتحقق مما إذا كان طابور الانتظار غير المتزامن فارغًا أم لا. | ||
===[[Ruby/Thread/priority | التابع priority]]=== | ===[[Ruby/Thread/priority| التابع priority]]=== | ||
يُعيد التابع <code>priority</code> أولوية [[Ruby/Thread|المهمة الفرعية]] | يُعيد التابع <code>priority</code> أولوية [[Ruby/Thread|المهمة الفرعية]] | ||
===[[Ruby/Thread/priority-3D | التابع priority=]]=== | ===[[Ruby/Thread/priority-3D| التابع priority=]]=== | ||
يعين التابع <code>priority=</code> أولوية | يعين التابع <code>priority=</code> أولوية [[Ruby/Thread|المهمة فرعية]] عند القيمة <code>integer.</code> | ||
===[[Ruby/Thread/raise | التابع raise]]=== | ===[[Ruby/Thread/raise| التابع raise]]=== | ||
يطلق التابع <code>raise</code> استثناء من [[Ruby/Thread|مهمة فرعية]] معينة | يطلق التابع <code>raise</code> استثناء من [[Ruby/Thread|مهمة فرعية]] معينة. | ||
===[[Ruby/Thread/ | ===[[Ruby/Thread/report on exception| التابع report_on_exception]]=== | ||
يعيد التابع <code>report_on_exception</code> حالة "report on exception". | يعيد التابع <code>report_on_exception</code> حالة "report on exception". | ||
===[[Ruby/Thread/ | ===[[Ruby/Thread/report on exception-3D| التابع report_on_exception=]]=== | ||
يُعيد التابع <code>report_on_exception=</code> الحالة الجديدة. | يُعيد التابع <code>report_on_exception=</code> الحالة الجديدة. | ||
===[[Ruby/Thread/run | التابع run]]=== | ===[[Ruby/Thread/run| التابع run]]=== | ||
يوقظ التابع <code>run</code> [[Ruby/Thread|المهمة الفرعية]] | يوقظ التابع <code>run</code> [[Ruby/Thread|المهمة الفرعية]]، مما يجعلها متاحة للجدولة. | ||
===[[Ruby/Thread/ | ===[[Ruby/Thread/safe level| التابع safe_level]]=== | ||
يُعيد التابع <code>safe_level</code> المستوى الآمن لل[[Ruby/Thread|مهمة فرعية]] | يُعيد التابع <code>safe_level</code> المستوى الآمن لل[[Ruby/Thread|مهمة فرعية]]. | ||
===[[Ruby/Thread/ | ===[[Ruby/Thread/set trace func| التابع set_trace_func]]=== | ||
يجعل التابع <code>set_trace_func</code> الوسيط المعطى <code>proc</code> | يجعل التابع <code>set_trace_func</code> الوسيط المعطى <code>proc</code> معالجا للتعقب في [[Ruby/Thread|المهمة الفرعية]]. | ||
===[[Ruby/Thread/status | التابع status]]=== | ===[[Ruby/Thread/status| التابع status]]=== | ||
يُعيد التابع <code>status</code> حالة | يُعيد التابع <code>status</code> حالة [[Ruby/Thread|المهمة الفرعية]]. | ||
===[[Ruby/Thread/stop-3F | التابع stop?]]=== | ===[[Ruby/Thread/stop-3F| التابع stop?]]=== | ||
يُعيد التابع <code>stop?</code> القيمة <code>true</code> إن كانت [[Ruby/Thread|المهمة الفرعية]] | يُعيد التابع <code>stop?</code> القيمة <code>true</code> إن كانت [[Ruby/Thread|المهمة الفرعية]] ميتة أو نائمة. | ||
===[[Ruby/Thread/terminate | التابع terminate]]=== | ===[[Ruby/Thread/terminate| التابع terminate]]=== | ||
ينهي التابع <code>terminate</code> [[Ruby/Thread|المهمة الفرعية]] | ينهي التابع <code>terminate</code> [[Ruby/Thread|المهمة الفرعية]] ويُجدوِل [[Ruby/Thread|مهمة فرعية]] أخرى ليتم تشغيلها. | ||
===[[Ruby/Thread/ | ===[[Ruby/Thread/thread variable-3F| التابع thread_variable?]]=== | ||
يُعيد التابع <code>thread_variable?</code> القيمة <code>true</code> إن كانت [[Ruby/String|السلسلة النصية]] (أو الرمز) موجودة كمتغير | يُعيد التابع <code>thread_variable?</code> القيمة <code>true</code> إن كانت [[Ruby/String|السلسلة النصية]] (أو الرمز) موجودة كمتغير محلي [[Ruby/Thread|المهمة الفرعية]] (thread-local variable). | ||
===[[Ruby/Thread/ | ===[[Ruby/Thread/thread variable get| التابع thread_variable_get]]=== | ||
يُعيد التابع <code>thread_variable_get</code> قيمة المتغير المحلي في [[Ruby/Thread|المهمة الفرعية]] (thread local variable) الذي تم تعيينه | يُعيد التابع <code>thread_variable_get</code> قيمة المتغير المحلي في [[Ruby/Thread|المهمة الفرعية]] (thread local variable) الذي تم تعيينه. | ||
===[[Ruby/Thread/ | ===[[Ruby/Thread/thread variable set| التابع thread_variable_set]]=== | ||
يعين التابع <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/ | ===[[Ruby/Thread/thread variables| التابع thread_variables]]=== | ||
يُعيد التابع <code>thread_variables</code> [[Ruby/Array|مصفوفة]] من أسماء المتغيرات المحلية في [[Ruby/Thread|المهمة الفرعية]] (thread-local) (على شكل رموز). | يُعيد التابع <code>thread_variables</code> [[Ruby/Array|مصفوفة]] من أسماء المتغيرات المحلية في [[Ruby/Thread|المهمة الفرعية]] (thread-local) (على شكل رموز). | ||
===[[Ruby/Thread/ | ===[[Ruby/Thread/to s| التابع to_s]]=== | ||
يعيد التابع <code>to_s</code> اسم و رقم تعريف وحالة [[Ruby/Thread|المهمة الفرعية]] على شكل [[Ruby/String|سلسلة نصية]]. | |||
===[[Ruby/Thread/value | التابع value]]=== | ===[[Ruby/Thread/value| التابع value]]=== | ||
ينتظر التابع <code>value</code> اكتمال [[Ruby/Thread|المهمة الفرعية]] | ينتظر التابع <code>value</code> اكتمال [[Ruby/Thread|المهمة الفرعية]] ، باستخدام <code>[[Ruby/Thread/join|join]]</code>، ثم يُعيد قيمتها. | ||
===[[Ruby/Thread/wakeup | التابع wakeup]]=== | ===[[Ruby/Thread/wakeup| التابع wakeup]]=== | ||
يجعل التابع <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 في توثيق روبي الرسمي.] |
مراجعة 14:07، 6 نوفمبر 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 }
تهيئة المهام الفرعية (Thread initialization)
لإنشاء مهام فرعية جديدة، توفر روبي عدة توابع لذلك: new
و start
و fork
. يجب تمرير كتلة مع كل هذه التوابع، وإلا سيُطلق استثناء ThreadError
.
عند اشتقاق أصناف فرعية (subclasses) من Thread
، فسيتم تجاهل التابع initialize
الخاص بصنفك الفرعي من قبل التوابع start
و fork
. لذلك تأكد من استدعاء المتغير super
في التابع initialize
خاصتك.
إنهاء المهمة الفرعية (Thread termination)
توفر روبي مجموعة متنوعة من الطرق لإنهاء المهام الفرعية.
يقوم التابع kill
بإنهاء المهمة الفرعية المعطاة:
thr = Thread.new { ... }
Thread.kill(thr) # sends exit() to thr
أو يمكنك استخدام تابع النسخة exit
، أو أحد مرادفيه kill
و terminate
.
thr.exit
حالة المهمة الفرعية (Thread status)
توفر روبي عددا من من توابع النسخ (instance methods) لاستخلاص حالة مهمة فرعية معينة. للحصول على سلسلة نصية تحتوي حالة المهمة الفرعية الحالية استخدم التابع status
:
thr = Thread.new { sleep }
thr.status # => "sleep"
thr.exit
thr.status # => false
يمكنك أيضًا استخدام alive?
للتحقق مما إذا كانت المهمة الفرعية قيد التشغيل أو نائمة، أو التابع stop?
للتحقق مما إذا كانت المهمة الفرعية ميتة أو نائمة.
متغيرات ونطاق المهمة الفرعية (Thread variables and scope)
نظرًا لكون المهام الفرعية تُنشأ بواسطة الكتل، فستنطبق القواعد نفسها على كتل روبي الأخرى فيما يتعلق بنطاق (scope) المتغيرات. المتغيرات المحلية التي تم إنشاؤها داخل هذه الكتلة لا يمكن الوصول إليها إلا من داخل هذه المهمة الفرعية.
المتغيرات محلية-الألياف مقابل المتغيرات محلية المهام الفرعية (Fiber-local vs. Thread-local)
يحتوي كل ليف (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) إعطاء الأسبقية لمهام فرعية معينة عند التنفيذ. يعتمد هذا التابع أيضًا على نظام التشغيل، وقد يُتجاهل في بعض الأنظمة.
توابع الصنف العامة (Public Class Methods)
التابع DEBUG
يُعيد التابع DEBUG
مستوى التصحيح في المهمة الفرعية (thread debug level).
التابع DEBUG=
يعيّن التابع DEBUG=
مستوى تصحيح المهمة الفرعية (thread debug level). م
التابع abort_on_exception
يُعيد التابع abort_on_exception
حالة الشرط العام "abort on exception".
التابع abort_on_exception=
عند إعطائه القيمة true
، فأي مهمة فرعية توقف بواسطة استثناء، سيتم إطلاق ذلك الاستثناء مجددا في المهمة الفرعية الرئيسية (main thread).
التابع current
يُعيد التابع current
المهمة الفرعية المُنفّذة حاليا.
التابع exclusive
يغلف التابع exclusive
الكتلة المعطاة في دالة الآلة الافتراضية العامة (VM-global) Mutex#synchronize
.
التابع exit
ينهي التابع exit
المهمة الفرعية قيد التشغيل، ويُجدول مهمة فرعية أخرى ليتم تشغيلها.
التابع fork
التابع fork
مكافئ للتابع new
.
التابع handle_interrupt
يغير التابع handle_interrupt
توقيت التوقيف غير المتزامن (asynchronous interrupt timing).
التابع kill
بقوم التابع kill
بإنهاء المهمة الفرعية المعطاة.
التابع list
يُعيد التابع list
مصفوفة من المهام الفرعية المشتغلة أو المتوقفة.
التابع main
يُعيد التابع main
المهمة الفرعية الرئيسية.
التابع new
ينشئ التابع new
مهمة فرعية جديدة تقوم بتنفيذ الكتلة المعطاة.
التابع pass
يعطي التابع pass
إلى مُجدوِل المهمة الفرعية تلميحًا لتمرير التنفيذ إلى مهمة فرعية أخرى.
التابع pending_interrupt?
يتحقق التابع pending_interrupt?
مما إذا كان طابور الانتظار غير المتزامن فارغًا أم لا.
التابع report_on_exception
يعيد التابع report_on_exception
حالة report on exception".
التابع report_on_exception=
يُعيد التابع report_on_exception=
الحالة الجديدة.
التابع start
يشبه التابع start
التابع new
.
التابع stop
يوقف التابع stop
تنفيذ المهمة الفرعية الحالية،
تزوابع النسخة العامة (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
مهمة فرعية معينة متاحة للجدولة.