محتويات الدورة

Bash / المتقدم: القنوات والتزامن وتصميم واجهة قابلة للصيانة / الدرس 15

تحديد العمل المتزامن وبروتوكولات العمليات المرافقة

صمم دفعات عمال وقنوات مرافقة محدودة بملكية EOF والإكمال والفشل بدل إطلاق خلفية منفلت.

وقت القراءة التقريبي: 3 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • فصل حد التزامن من حجم العمل.
  • شرح واصفات المرافقة وإكمالها.
  • منع الانسداد وفشل عمال غير مرصود.

التزامن عقد موارد

قد يستنفد ابن لكل سجل المهام والواصفات والذاكرة أو التالي. حدد حداً وسلوك الامتلاء. يبدأ الحاجز دفعة وينتظرها والديناميكي يستبدل المنتهي مع تتبع أدق. تشمل الصحة الترتيب والخطأ والإلغاء والذاكرة لا الإنتاجية فقط. نستخدم مهام صغيرة لا حملاً أو عملاً غير محدود.

حاجز الدفعة بسيط للمراجعة

تمثل مصفوفة معرفات دفعة. احفظ الإطلاق وانتظر وسجل الفشل ثم امسح حالتها واجمع البقية الأخيرة. قد تخمل سعة مع بطيء مقابل بساطة مناسبة للصغير. لا تعدل عداد الأب في الخلفية وتتوقع التجميع. أعد قناة أو حدث الأب بعد الانتظار بخريطة المهمة.

bash تشغيل حاجز ابنين لأربع مهام آمنة
pids=()
completed=0
for item in a b c d; do
  ( : "$item" ) &
  pids+=("$!")
  if (( ${#pids[@]} == 2 )); then
    for pid in "${pids[@]}"; do wait "$pid" || exit 1; completed=$((completed+1)); done
    pids=()
  fi
done
for pid in "${pids[@]}"; do wait "$pid" || exit 1; completed=$((completed+1)); done
printf 'completed=%s\n' "$completed"
الناتج المتوقع
completed=4

ينفذ كل ابن لا عملية ببيانات مصطنعة ويعد الأب الإكمال المتحقق ضمن حجم الدفعة.

المرافقة زوج قنوات غير متزامن

تنشئ coproc خلفية بقناتي قراءة وكتابة ومصفوفة وPID. لا يساوي الإطلاق الإكمال. احفظ الواصفات والهوية قبل زوال المتغيرات. هي امتداد بدعم الأنابيب. عرف حدود السجل ومن يبدأ والعدد والإغلاق المعلن EOF. إنها بروتوكول لا عودة سحرية.

تحديد الاتجاهين وإغلاق غير المستخدم

للأنبوب سعة محدودة وقد يحجب الطرفان بالكتابة قبل القراءة. وقد ينتظر القارئ EOF لطرف موروث مفتوح. صمم تبادلاً محدوداً أو تدفقاً بضغط عكسي. انسخ المملوك للثبات وأغلقه. افصل EOF والتشوه والإكمال؛ لا تثبت قراءة رد خروجاً صحيحاً ولا الصفر صحة كل رد.

bash تبادل سجل مصطنع محدود واحد
coproc WORKER { IFS= read -r input; printf '<%s>\n' "$input"; }
worker_pid=$WORKER_PID
exec {reader}<&"${WORKER[0]}"
exec {writer}>&"${WORKER[1]}"
printf '%s\n' 'synthetic request' >&"$writer"
IFS= read -r reply <&"$reader"
exec {writer}>&-
exec {reader}<&-
wait "$worker_pid" || exit 1
printf 'reply=%s\n' "$reply"
الناتج المتوقع
reply=<synthetic request>

ينتظر الابن سجلاً ويرد واحداً وتحفظ النسخ الوصول عند خروجه وتتحقق wait قبل العرض.

استخدام أداة أقوى عند هيمنة التنسيق

يناسب المنسق مخططاً صغيراً بقواعد ظاهرة. قد تحتاج إعادة معقدة أو طوابير دائمة أو إلغاء موزع لغة أو نظاماً آخر. لا تعقد لمجرد علم wait أحدث دون الدعم. اعزل المدخل والخرج واحفظ الحالات واختبر الفشل والإلغاء. يحمي الحد إذا اتبعته كل الإطلاقات وبقيت الملكية حتى الإكمال أو نقل موثق.

الأخطاء الشائعة وإصلاحها

إطلاق خلفية لكل سجل بلا حد

لماذا يحدث؟
صار حجم الإدخال حد العمليات.
كيف تصلحه؟
أضف دفعة أو مجمعاً محدوداً.
كيف تتجنب تكراره؟
اختبر الحد بمدخلات مصطنعة محدودة.

انتظار طرفي المرافقة للأبد

لماذا يحدث؟
لم يعرف ترتيب البروتوكول أو EOF.
كيف تصلحه؟
حدد التبادل وأغلق غير المستخدم.
كيف تتجنب تكراره؟
اختبر غياب الرد والخروج المبكر.

قبول الرد قبل wait

لماذا يحدث؟
اختلط تلقي البيانات بالإكمال.
كيف تصلحه؟
تحقق من الرد واجمع الحالة مستقلة.
كيف تتجنب تكراره؟
اجعل الشرطين جزء النجاح.

اختبر فهمك

1. ماذا يفعل المنسق ببقية واحدة وحده اثنان؟

اعرض الحل المشروح

يجمعها ويتحقق. الحد أقصى لا سبب إسقاط البقية. احفظ القائمة وطبق السياسة بعد الحلقة.

2. لماذا قد يبقى فشل رغم قراءة رد صحيح؟

اعرض الحل المشروح

قد يطبع جزئياً صحيحاً ثم يفشل. تحقق من الرد الكامل وانتظر الهوية المحفوظة وبلغ التشوه وغير الصفري دون إخفاء.

أهم ما تعلمته

  • حد الإطلاق واحفظ الملكية حتى الإكمال.
  • عامل قنوات المرافقة بروتوكولات صريحة.

المراجع الرسمية