الإدخال/الإخراج المُعيق (blocking) يوقف الخيط المُستدعي حتى تنتهي العملية؛ وغير المُعيق (non-blocking) يعود فورًا ويترك الخيط يقوم بعمل آخر بينما تكتمل العملية. المتزامن مقابل غير المتزامن (sync vs async) يصف الفكرة نفسها على مستوى الـ API.
الإدخال/الإخراج المُعيق (blocking) يوقف الخيط المُستدعي حتى تنتهي العملية؛ وغير المُعيق (non-blocking) يعود فورًا ويترك الخيط يقوم بعمل آخر بينما تكتمل العملية. المتزامن مقابل غير المتزامن (sync vs async) يصف الفكرة نفسها على مستوى الـ API.
read() حتى تصل البيانات. بسيط، لكن الخيط عاطل طوال الوقت — ولخدمة N من العملاء البطيئين تحتاج إلى N من الخيوط.Blocking: ──[ wait for disk ]── (thread stuck, does nothing)
Non-blocking: ──▶ returns now; event loop notified when ready
// Blocking: nothing else runs until the file is read
const data = fs.readFileSync('big.txt');
// Non-blocking: thread keeps going; callback fires later
fs.readFile('big.txt', (err, data) => { /* handle later */ });
// or async/await on top of non-blocking primitives
const data2 = await fs.promises.readFile('big.txt');
هذا جوهر الخوادم القابلة للتوسّع. تتعامل Node.js و nginx مع أعداد اتصالات ضخمة على خيوط قليلة تحديدًا لأن الإدخال/الإخراج غير مُعيق — فالانتظار لا يشغل خيطًا. استخدم الاستدعاءات المُعيقة للبساطة في السكربتات؛ واستخدم غير المُعيقة لخدمات الشبكة عالية التزامن، ولا تُعِق الـ event loop أبدًا بعمل ثقيل على المعالج.
مكتبة من أسئلة مقابلات تقنية المعلومات مع إجابات مفصّلة — من المبتدئ إلى المتقدم.
تبرع