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

من موسوعة حسوب
طلا ملخص تعديل
طلا ملخص تعديل
 
(مراجعة متوسطة واحدة بواسطة مستخدم واحد آخر غير معروضة)
سطر 1: سطر 1:
{{DISPLAYTITLE:الصنف <code>Fiber</code> في روبي}}
{{DISPLAYTITLE:الصنف <code>Fiber</code> في روبي}}
الألياف (Fibers) هي حقولٌ أساسيّةٌ (primitives) تُستخدم في تنفيذ تعدّد المهام التشاركي (cooperative concurrency) للمهام الخفيفة (light weight) أي التي تستهلك جزءًا صغيرًا من الذاكرة. تعني أساسيًّا إنشاء كتل شيفرات يمكن إيقافها مؤقتًا واستئنافها، كما هو الحال مع المسارات (threads). الفرق الأساسي في الألياف أنه لا يمكن إيقافها مؤقّتًا من قبل مهام أخرى تنفذ من قبل النظام (Preemption) وأن الجدولة (scheduling) يجب أن تتمَّ من قبل المبرمج وليس من قبل الآلة الافتراضية (virual machine).
الألياف (Fibers) هي حقولٌ أساسيّةٌ (primitives) تُستخدم في تنفيذ تعدّد المهام التشاركي (cooperative concurrency) للمهام الخفيفة (light weight) أي التي تستهلك جزءًا صغيرًا من الذاكرة. تعني أساسيًّا إنشاء كتل شيفرات يمكن إيقافها مؤقتًا واستئنافها، كما هو الحال مع الخيوط (threads). الفرق الأساسي في الألياف أنه لا يمكن إيقافها مؤقّتًا من قبل مهام أخرى تنفذ من قبل النظام (Preemption) وأن الجدولة (scheduling) يجب أن تتمَّ من قبل المبرمج وليس من قبل الآلة الافتراضية (virtual machine).


على عكس نماذج تعدد المهام التشاركية الخفيفة الأخرى التي لا تعتمد على التكدسات (stackless)، يأتي كل ليف مع كدسة (stack). هذا يُمكِّن الليف أن يُوقَف مؤقتًا من قبل استدعاءات الدوال المتداخلة (nested function) خلال كتلة الليف، ألقِ نظرة على ruby(1) manpage لضبط مساحة تكدسات الليف.
على عكس نماذج تعدد المهام التشاركية الخفيفة الأخرى التي لا تعتمد على التكدسات (stackless)، يأتي كل ليف مع مكدس (stack). هذا يُمكِّن الليف أن يُوقَف مؤقتًا من قبل استدعاءات الدوال المتداخلة (nested function) خلال كتلة الليف، ألقِ نظرة على <code>ruby(1) manpage</code> لضبط مساحة تكدسات الليف.


لن يعمل الليف تلقائيًّا عندما يُنشأ، يجب أن يُطلب تشغيله بوضوح باستخدام التّابع <code>[[Ruby/Fiber/resume|Fiber.resume]]</code>. يمكن للشيفرة العاملة داخل الليف أن تتخلى عن التحكّم عن طريق استدعاء التابع <code>[[Ruby/Fiber/yield|Fiber.yield]]</code> الذي يعطي في هذه الحالة التحكّم مرةً أخرى إلى المستدعي caller (مستدعي التّابع <code>[[Ruby/Fiber/resume|Fiber.resume]]</code>).
لن يعمل الليف تلقائيًّا عندما يُنشأ، لذا يجب أن يُطلب تشغيله بصريح العبارة باستخدام التّابع <code>[[Ruby/Fiber/resume|Fiber.resume]]</code>. يمكن للشيفرة العاملة داخل الليف أن تتخلى عن التحكّم عن طريق استدعاء التابع <code>[[Ruby/Fiber/yield|Fiber.yield]]</code> الذي يعطي في هذه الحالة التحكّم مرةً أخرى إلى المستدعي (caller، مستدعي التّابع <code>[[Ruby/Fiber/resume|Fiber.resume]]</code>).


عند توليد ليف أو إنهاؤه ، يُعيد الليف قيمة آخِر تعبيرٍ تمَّ تنفيذه.
عند توليد ليف أو إنهائه، يُعيد الليف قيمة آخِر تعبيرٍ تمَّ تنفيذه.


مثال:<syntaxhighlight lang="ruby">
اطلع على المثال التالي الذي يشرح ما سبق:<syntaxhighlight lang="ruby">
fiber = Fiber.new do
fiber = Fiber.new do
 
  Fiber.yield 1
 Fiber.yield 1
  2
 
 2
 
end
end


puts fiber.resume
puts fiber.resume
puts fiber.resume
puts fiber.resume
puts fiber.resume
puts fiber.resume


سطر 26: سطر 21:
</syntaxhighlight>سيعطي هذا المثال عند تنفيذه:<syntaxhighlight lang="ruby">
</syntaxhighlight>سيعطي هذا المثال عند تنفيذه:<syntaxhighlight lang="ruby">
1
1
2
2
FiberError: dead fiber called
FiberError: dead fiber called




</syntaxhighlight>يقبل التّابع <code>[[Ruby/Fiber/resume|Fiber.resume]]</code> عدد عشوائي من المعاملات، إذا كان هذا استدعاء الاستئناف الأول ستُمرّر المعاملات على أنها وسائط (block arguments). وإلا سيكونون القيمة المرجعة من استدعاء <code>[[Ruby/Fiber/yield|Fiber.yield]]</code>.
</syntaxhighlight>يقبل التّابع <code>[[Ruby/Fiber/resume|Fiber.resume]]</code> عددًا عشوائيًّا من المعاملات؛ إذا كان هذا استدعاء الاستئنافَ الأول، فستُمرّر المعاملات على أنَّها وسائط (block arguments) وإلا سيكونون القيمة المرجعة من استدعاء <code>[[Ruby/Fiber/yield|Fiber.yield]]</code>.


مثال:<syntaxhighlight lang="ruby">
مثال:<syntaxhighlight lang="ruby">
fiber = Fiber.new do |first|
fiber = Fiber.new do |first|
 
  second = Fiber.yield first + 2
 second = Fiber.yield first + 2
 
end
end


puts fiber.resume 10
puts fiber.resume 10
puts fiber.resume 14
puts fiber.resume 14
puts fiber.resume 18
puts fiber.resume 18


سطر 50: سطر 39:
</syntaxhighlight>سيعطي عند تنفيذه:<syntaxhighlight lang="ruby">
</syntaxhighlight>سيعطي عند تنفيذه:<syntaxhighlight lang="ruby">
12
12
14
14
FiberError: dead fiber called
FiberError: dead fiber called



المراجعة الحالية بتاريخ 19:12، 18 أكتوبر 2018

الألياف (Fibers) هي حقولٌ أساسيّةٌ (primitives) تُستخدم في تنفيذ تعدّد المهام التشاركي (cooperative concurrency) للمهام الخفيفة (light weight) أي التي تستهلك جزءًا صغيرًا من الذاكرة. تعني أساسيًّا إنشاء كتل شيفرات يمكن إيقافها مؤقتًا واستئنافها، كما هو الحال مع الخيوط (threads). الفرق الأساسي في الألياف أنه لا يمكن إيقافها مؤقّتًا من قبل مهام أخرى تنفذ من قبل النظام (Preemption) وأن الجدولة (scheduling) يجب أن تتمَّ من قبل المبرمج وليس من قبل الآلة الافتراضية (virtual machine).

على عكس نماذج تعدد المهام التشاركية الخفيفة الأخرى التي لا تعتمد على التكدسات (stackless)، يأتي كل ليف مع مكدس (stack). هذا يُمكِّن الليف أن يُوقَف مؤقتًا من قبل استدعاءات الدوال المتداخلة (nested function) خلال كتلة الليف، ألقِ نظرة على ruby(1) manpage لضبط مساحة تكدسات الليف.

لن يعمل الليف تلقائيًّا عندما يُنشأ، لذا يجب أن يُطلب تشغيله بصريح العبارة باستخدام التّابع Fiber.resume. يمكن للشيفرة العاملة داخل الليف أن تتخلى عن التحكّم عن طريق استدعاء التابع Fiber.yield الذي يعطي في هذه الحالة التحكّم مرةً أخرى إلى المستدعي (caller، مستدعي التّابع Fiber.resume).

عند توليد ليف أو إنهائه، يُعيد الليف قيمة آخِر تعبيرٍ تمَّ تنفيذه.

اطلع على المثال التالي الذي يشرح ما سبق:

fiber = Fiber.new do
  Fiber.yield 1
  2
end

puts fiber.resume
puts fiber.resume
puts fiber.resume

سيعطي هذا المثال عند تنفيذه:

1
2
FiberError: dead fiber called

يقبل التّابع Fiber.resume عددًا عشوائيًّا من المعاملات؛ إذا كان هذا استدعاء الاستئنافَ الأول، فستُمرّر المعاملات على أنَّها وسائط (block arguments) وإلا سيكونون القيمة المرجعة من استدعاء Fiber.yield. مثال:

fiber = Fiber.new do |first|
  second = Fiber.yield first + 2
end

puts fiber.resume 10
puts fiber.resume 14
puts fiber.resume 18

سيعطي عند تنفيذه:

12
14
FiberError: dead fiber called

توابع الصنف العامة (Public Class Methods)

current

يُعيد التّابع current الليف (fiber) الحالي.

yield

يتحكم التّابع yield مجدَّدًا بالسياق (contex) الذي استئنَفَ عمل الليف (fiber) مُمرِّرًا أيَّ وسائط قد مُرِّرت إليه.

توابع الكائن العامة (Public Instance Methods)

?alive

يُعيد التّابع ?alive القيمة true إذا كان لا يزال استئناف (أو نقل) الليف (fiber) ممكنًا.

inspect

يُعدُّ التّابع inspect اسمًا بديلًا (alias) للتّابع to_s.

resume

يستأنف التّابع resume الليف (fiber) من النقطة التي استدعُي فيها التّابع Fiber.yield آخر مرّة.

to_s

يُعيد التّابع to_s معلوماتٍ عن الليف (fiber) بشكل سلسلةٍ نصيةٍ.

transfer

ينقل التّابع transfer التحكّم إلى ليف (fiber) آخر، أو يستأنف عمل الليف الحالي عند آخر نقطة أوقف فيها، أو يبدأه إذا لم يُستأنَف سابقًا.

مصادر