الفرق بين المراجعتين ل"Ruby/Thread/handle interrupt"

من موسوعة حسوب
< Ruby‏ | Thread
اذهب إلى التنقل اذهب إلى البحث
(أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE: التابع <code>handle_interrupt‎</code> الخاص بالصنف <code>Thread</code> في روبي}}</noinclude> تصنيف: Ruby...')
 
سطر 3: سطر 3:
 
[[تصنيف: Ruby Method]]
 
[[تصنيف: Ruby Method]]
 
[[تصنيف: Ruby Thread]]
 
[[تصنيف: Ruby Thread]]
يغير التابع <code>handle_interrupt</code> توقيت المقاطعة غير المتزامنة (asynchronous interrupt timing).
+
يغير التابع <code>handle_interrupt</code> توقيت التوقيف غير المتزامن (asynchronous interrupt timing).
  
يعني <code>interrupt</code> الحدث غير المتزامن (asynchronous event) والإجراء المقابل <code>[[Ruby/Thread/raise|#raise]]</code> و <code>[[Ruby/Thread/kill|#kill]]</code>، وإشارة المسك signal trap (غير مدعومة حاليًا)، وإنهاء [[Ruby/Thread|المهمة الفرعية]] الرئيسية (عند إنهاء [[Ruby/Thread|المهمة الفرعية]] الرئيسية، فسيتم إنهاء كل [[Ruby/Thread|المهمة الفرعية]] الأخرى).
+
التوقيف (interrupt ) يعني الحدث غير المتزامن (asynchronous event) والإجراء المقابل <code>[[Ruby/Thread/raise|raise]]</code> و <code>[[Ruby/Thread/kill|kill]]</code> وإشارة المسك signal trap (غير مدعومة حاليًا) وعملية إنهاء [[Ruby/Thread|المهمة الفرعية]] الرئيسية (عند إنهاء [[Ruby/Thread|المهمة الفرعية]] الرئيسية، فسيتم إنهاء كل [[Ruby/Thread|المهام الفرعية]] الأخرى).
  
يتحتوي الوسيط المعطى <code>hash</code> (انظر فقرة البنية العامة) أزواج على شاكلة <code>ExceptionClass =>
+
يحتوي الوسيط المعطى <code>hash</code> (انظر فقرة البنية العامة) أزواج على شاكلة <code>ExceptionClass => :TimingSymbol</code>. حيث <code>ExceptionClass</code> هو التوقيف (interrupt) المٌعالج من قبل الكتلة المعطاة. أما <code>TimingSymbol</code> فيمكن أن يكون أحد الرموز التالية:
:TimingSymbol</code>. حيث ExceptionClass هو التوقيف (interrupt) الذي يعالج من قبل الكتلة المعطاة. يمكن أن يكون TimingSymbol أحد الرموز التالية:
+
* ‎<code>:immediate</code> - يستدعي التوقيفات على الفور.
 +
* ‎<code>:on_blocking</code> - يستدعي التوقيفات أثناء الحالة <code>BlockingOperation</code>.
 +
* ‎<code>:never</code> - لا يستدعي جميع التوقيفات أبدا.
 +
مصطلح <code>BlockingOperation</code> يعني أن العملية ستقوم بتعطيل [[Ruby/Thread|المهمة الفرعية]] المستدعية (calling thread)، مثل <code>read</code> و <code>write</code>.  في إصدار CRuby ، س​​تكون <code>BlockingOperation</code> أي عملية تنفذ بدون قفل الآلة الافتراضية العام (Global VM Lock أو اختصارًا GVL).
  
<code>:immediate</code>
+
التوقيفات غير المتزامنة المقنعة (Masked asynchronous interrupts) ستُؤجل إلى حين تمكينها.
  
يستدعي التوقيفات على الفور.
+
هذا التابع مشابه للتعبير<code>sigprocmask(3)‎</code>.
  
<code>:on_blocking</code>
+
'''ملحوظة'''
 
 
يستدعي التوقيفات أثناء <code>BlockingOperation</code>.
 
 
 
<code>:never</code>
 
 
 
لا يستدعي جميع التوقيفات أبدا.
 
 
 
مصطلح <code>BlockingOperation</code> يعني أن العملية ستقوم بتعطيل [[Ruby/Thread|المهمة الفرعية]] المستدعية (calling thread)، مثل read و write.  في إصدار CRuby ، س​​تكون <code>BlockingOperation</code> أي عملية تنفذ بدون قفل الآلة الافتراضية العام (Global VM Lock أو اختصارًا GVL).
 
 
 
التوقيفات غير المتزامن المقنعة (Masked asynchronous interrupts) ستُؤجل إلى حين يتم تمكينها. هذا التابع مشابه للتابع sigprocmask (3).
 
 
 
ملحوظة
 
<code>[[Ruby//handle_interrupt-label-NOTE|¶]]</code> <code>[[Ruby//top|↑]]</code>
 
  
 
يصعب استخدام التوقبفات غير المتزامنة.
 
يصعب استخدام التوقبفات غير المتزامنة.
  
إذا كنت بحاجة إلى إجراء اتصالات بين [[Ruby/Thread|المهمة الفرعية]]، فالرجاء استخدام طريقة أخرى، مثل <code>[[Ruby/Queue|Queue]]</code>.
+
إذا كنت بحاجة إلى إجراء اتصالات بين [[Ruby/Thread|المهام الفرعية]]، فالرجاء استخدام طريقة أخرى، مثل الطوابير (<code>[[Ruby/Queue|Queues]])</code>.
 
 
أو استخدمها هذا التابع، لكن مع فهم عميق لخصائصه.
 
  
الاستخدام
+
وإن كنت مصرّا على استخدام هذا التابع، فاستخدمه، لكن مع فهم عميق لخصائصه.
<code>[[Ruby//handle_interrupt-label-Usage|¶]]</code> <code>[[Ruby//top|↑]]</code>
 
  
 +
== الاستخدام ==
 
في هذا المثال، يمكننا الاحتراز من استثناءات <code>[[Ruby/Thread/raise|#raise]]</code>.
 
في هذا المثال، يمكننا الاحتراز من استثناءات <code>[[Ruby/Thread/raise|#raise]]</code>.
  

مراجعة 21:02، 5 نوفمبر 2018

يغير التابع handle_interrupt توقيت التوقيف غير المتزامن (asynchronous interrupt timing).

التوقيف (interrupt ) يعني الحدث غير المتزامن (asynchronous event) والإجراء المقابل raise و kill وإشارة المسك signal trap (غير مدعومة حاليًا) وعملية إنهاء المهمة الفرعية الرئيسية (عند إنهاء المهمة الفرعية الرئيسية، فسيتم إنهاء كل المهام الفرعية الأخرى).

يحتوي الوسيط المعطى hash (انظر فقرة البنية العامة) أزواج على شاكلة ExceptionClass => :TimingSymbol. حيث ExceptionClass هو التوقيف (interrupt) المٌعالج من قبل الكتلة المعطاة. أما TimingSymbol فيمكن أن يكون أحد الرموز التالية:

  • :immediate - يستدعي التوقيفات على الفور.
  • :on_blocking - يستدعي التوقيفات أثناء الحالة BlockingOperation.
  • :never - لا يستدعي جميع التوقيفات أبدا.

مصطلح BlockingOperation يعني أن العملية ستقوم بتعطيل المهمة الفرعية المستدعية (calling thread)، مثل read و write. في إصدار CRuby ، س​​تكون BlockingOperation أي عملية تنفذ بدون قفل الآلة الافتراضية العام (Global VM Lock أو اختصارًا GVL).

التوقيفات غير المتزامنة المقنعة (Masked asynchronous interrupts) ستُؤجل إلى حين تمكينها.

هذا التابع مشابه للتعبيرsigprocmask(3)‎.

ملحوظة

يصعب استخدام التوقبفات غير المتزامنة.

إذا كنت بحاجة إلى إجراء اتصالات بين المهام الفرعية، فالرجاء استخدام طريقة أخرى، مثل الطوابير (Queues).

وإن كنت مصرّا على استخدام هذا التابع، فاستخدمه، لكن مع فهم عميق لخصائصه.

الاستخدام

في هذا المثال، يمكننا الاحتراز من استثناءات #raise.

عند استخدام رمز التوقيت (TimingSymbol‏) :never، سيتم تجاهل الاستثناء RuntimeError دائما في الكتلة الأولى من المهمة الفرعية الرئيسية. في كتلة ::handle_interrupt الثانية يمكن معالجة الاستثناءات RuntimeError.


بينما نتجاهل الاستثناء RuntimeError، سيكون من الآمن كتابة تعليمات تخصيص الموارد. بعد ذلك، تكون كتلة التأمين (ensure block) هي المكان الذي يمكننا فيه تحرير (deallocate ) الموارد بأمان.

التحرز من الاستثناء Timeout::Error

في المثال التالي، سنحترز من الاستثناء Timeout::Error. سيساعد هذا على منع هدر الموارد عند حدوث استثناء Timeout::Error أثناء كتلة تأمين (ensure clause) عادية. في هذا المثال، سنتعين بالمكتبة القياسي للمكتبة Timeout من lib/timeout.rb.


في الجزء الأول من كتلة timeout ، يمكننا الاعتماد على حقيقة أن Timeout::Error سيتم تجاهله. ثم في كتلة Timeout::Error =>

on_blocking، أي عملية تعطل المهمة الفرعية المستدعية (calling thread) ستكون عرضة لاستثناء Timeout :: Error.

إعدادات التحكم في المكدس (Stack control settings)

من الممكن تكديس مستويات متعددة من كتل ::handle_interrupt من أجل التحكم في عدة كائنات ExceptionClass و TimingSymbol في وقت واحد.


الوراثة من ExceptionClass

سيتم أخذ كافة الاستثناءات الموروثة من الوسيط ExceptionClass بعين الاعتبار.

البنية العامة

handle_interrupt(hash) { ... }  result of the block

المعاملات

hash‎

القيمة المُعادة

أمثلة

مثال على استخدام التابع handle_interrupt‎:

th = Thread.new do
  Thread.handle_interrupt(RuntimeError => :never) {
    begin
      # You can write resource allocation code safely.
      Thread.handle_interrupt(RuntimeError => :immediate) {
        # ...
      }
    ensure
      # You can write resource deallocation code safely.
    end
  }
end
Thread.pass
# ...
th.raise "stop"

انظر أيضا

  • التابع fork: أساسا، التابع التابع fork مكافئ للتابع new. ومع ذلك ، في حال اشتقاق صنف فرعي من ::new، فإن استدعاء Thread في ذلك الصنف الفرعي لن يستدعي تابع الصنف الفرعي start.
  • التابع kill: بقوم التابع kill بإنهاء thread المعطى (انظر فقرة البنية العامة)، راجع أيضًا صفحة ::exit.

مصادر