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