مهمة دفعة واحدة أو واحدة تلو الأخرى
اليوم، واجهت إمدادات المياه في شقتنا بعض المشاكل ولم تتمكن من توفير المياه لفترة من الوقت. بعد الانتهاء من تناول الوجبة والنظر إلى أكوام الأطباق التي تركها أفراد عائلتي وأنا، خطرت لي عدة أسئلة.
أحدها هو كيفية جعل غسالة الأطباء تعمل دون إمداد مائي. قد يتم تصميمها لتكون متصلة بدلو من الماء. بالإضافة إلى ذلك، يجب أن يكون رأس توصيل أنبوب الماء مرنًا للتبديل بسهولة من إمداد المياه العام إلى دلو ماء خاص مصنوع ذاتيًا.
نقطة أخرى هي مسألة ما إذا كان ينبغي القيام بالمهمة على دفعات أو واحدة تلو الأخرى. يمكننا غسل الأطباق بعد كل وجبة أو الانتظار لغسلها بعد يوم أو بضعة أيام. هذا من وجهة نظر كيفية تناولنا للوجبات وغسل الأطباق. يمكننا أيضًا التعامل مع هذه المشكلة من وجهة نظر عدد الأطباق التي يمكن أن يستوعبها غسالة الأطباق.
يذكرني ذلك بالبرمجة. يمكننا تنفيذ المهام على دفعات أو واحدة تلو الأخرى.
إنجاز المهمة على دفعات يؤدي إلى مشكلة واضحة: يتطلب المزيد من الموارد. نحتاج إلى المزيد من الأطباق حيث نؤجل الغسيل، ويتطلب المزيد من مساحة الذاكرة حيث نتراكم البيانات لتأجيل معالجتها.
في الحياة الواقعية، هناك حد لكمية المساحة أو عدد العناصر التي يمكن التعامل معها في وقت واحد. على سبيل المثال، يمكن لغسالة الأطباق على الأرجح التعامل مع ما يصل إلى عشرين طبقًا كحد أقصى، تمامًا مثلما يكون للبرنامج حد للذاكرة على الكمبيوتر أو مثلما يكون للطريق حد لعدد السيارات التي يمكن أن تمر عبره.
هناك أيضًا مشكلة كيفية فصل المهمة. هل يجب أن نفصلها عنصرًا واحدًا في كل مرة أم ثلاثة عناصر في كل مرة؟
بالنسبة للأطباق أو السيارات، من السهل التعامل مع كل عنصر كوحدة. هذا يعني أن الطبق هو طبق، والسيارة هي سيارة. عادةً، لا يمكن تقسيمها إلى أجزاء أصغر. ومع ذلك، لا تزال هناك استثناءات، مثل الشاحنة الكبيرة التي تحمل العديد من السيارات؛ يمكن تقسيم الشاحنة الكبيرة إلى وحدة كبيرة واحدة والعديد من السيارات التي تمر على الطريق.
في البرمجة، يكون الأمر أكثر مرونة بكثير. حتى عمليات الإدراج أو التحديث في SQL يمكن تقسيمها إلى أجزاء أصغر، ناهيك عن مهمة تنزيل، بحث DFS، أو استعلام.
حسنًا، الآن فكرنا في وحدة المعالجة. ثم، السؤال هو كم عدد الوحدات التي يجب أن نعالجها في دفعة واحدة. يمكن أن يكون أي عدد بين واحد والعدد الإجمالي للوحدات.
السؤال هنا هو ما إذا كان يمكن تحديد عدد الدُفعات (batches) لوظيفة ما بشكل ثابت أو ديناميكي. بالنسبة للذكاء الاصطناعي التوليدي (Generative AI)، فإن إجمالي الأحرف لنص الإدخال يكون مرنًا. هناك بعض الحدود السياقية أو حدود الإدخال، ولكن ضمن نطاق هذه الحدود، يكون النص مرنًا.
عند استخدام غسالة الصحون، فإن مساحتها الداخلية لها حد معين. ضمن هذا الحد، يكون عدد الصحون مرنًا. عادةً ما نضع أكبر عدد ممكن من الصحون التي تحتاج إلى غسل داخل الغسالة.
بالنسبة للبرامج، هناك حد لعدد أوامر SQL التي يمكن لقاعدة البيانات التعامل معها في وقت واحد. ضمن هذا الحد، يكون عدد أوامر SQL التي يمكن التعامل معها مرنًا. ولكن يجب أن نأخذ في الاعتبار مهمة الشبكة المتمثلة في نقل أوامر SQL من العميل إلى خادم قاعدة البيانات، وكم من الوقت يمكن للمستخدم الانتظار، وما الذي يحدث إذا فشلت مهمة واحدة من الدُفعة.
لذلك، بالنسبة لمشكلة عدد المهام الوحدوية التي يجب أن نقوم بها في دفعة واحدة، يجب أن نأخذ في الاعتبار هدف الوظيفة، الحد الأقصى للمستهلك أو المعالج اللاحق، واحتمالية الفشل.
يمكن تطبيق طريقة التفكير هذه على العديد من الأشياء. هناك مشكلتان أساسيتان يجب النظر فيهما: ما هي المهمة الوحدة وكم عدد الوحدات التي يجب أن نعالجها في الدفعة الواحدة. من خلال النظر في هذه المشكلات، قد نصل إلى حل أمثل.