ব্লকিং বনাম নন-ব্লকিং এর ওভারভিউ
Bnlang-এ একটি অপারেশন হয় ব্লকিং, নয়তো নন-ব্লকিং:
- ব্লকিং — অপারেশন শেষ না হওয়া পর্যন্ত প্রোগ্রাম জায়গায় থামে। বাকি স্ক্রিপ্ট (এবং ইভেন্ট লুপ) থেমে থাকে।
- নন-ব্লকিং — প্রোগ্রাম অপারেশন কিক-অফ করে চলতে থাকে, এবং রেজাল্ট প্রস্তুত হলে রানটাইম পরে আপনার কলব্যাক কল করে।
বেশিরভাগ stdlib মডিউল দু'টা স্টাইলই দেয়। সাধারণ নিয়ম: sync ভ্যারিয়েন্টের নাম fn(), async ভ্যারিয়েন্টের নাম fn_async()।
Blocking Example
io.read_file পুরো ফাইল মেমোরিতে আসা পর্যন্ত ব্লক করে। ছোট ফাইল বা একবারের স্ক্রিপ্টের জন্য ঠিক আছে।
import "io" as io;
print("start");
var data = io.read_file("notes.txt"); // blocks here
print("file length:", data.byte_length);
print("end");
Non-Blocking Example
io.read_file_async সাথে সাথে ফেরত আসে; পড়া শেষ হলে কলব্যাক ফায়ার হয়। এর পরের লাইনগুলো মাঝখানে চলতে থাকে।
import "io" as io;
print("start");
io.read_file_async("notes.txt", function (err, data) {
if (err != null) { print("read failed:", err); return; }
print("file length:", data.byte_length);
});
print("scheduled, doing other work");
Streaming Large Files
খুব বড় ফাইলের জন্য read_file বা read_file_async কোনোটাই ঠিক না — দু'টাই পুরো ফাইল মেমোরিতে আনে।
io.open_read ব্যবহার করুন, যাতে স্ট্রিম থেকে চাঙ্ক-বাই-চাঙ্ক পুল করা যায়। কলব্যাকে chunk = null মানে EOF।
import "io" as io;
var src = io.open_read("big.log");
function on_chunk(err, chunk) {
if (err != null) { print("read err:", err); return; }
if (chunk == null) {
print("done");
src.close();
return;
}
print("got", chunk.byte_length, "bytes");
src.read(64 * 1024, on_chunk);
}
src.read(64 * 1024, on_chunk);
Why Non-Blocking Matters
- I/O চলাকালীন ওয়েব সার্ভার, GUI বা CLI কে রেসপন্সিভ রাখে।
- একাধিক ধীর অপারেশন (নেটওয়ার্ক কল, DB কুয়েরি, ফাইল অপ) একসাথে এগোতে দেয়।
- হেড-অফ-লাইন ব্লকিং এড়ায় — না হলে একটা ধীর রিকোয়েস্ট বাকি সবাইকে আটকে রাখতো।
Best Practices
- দীর্ঘ-চলা প্রোগ্রামে (সার্ভার, ডিমন) ডিফল্ট হিসেবে async ভ্যারিয়েন্ট ব্যবহার করুন।
- স্ক্রিপ্ট, বিল্ড স্টেপ, বা REPL এক্সপ্লোরেশনে — যেখানে সহজতা থ্রুপুটের চেয়ে গুরুত্বপূর্ণ — sync ভ্যারিয়েন্ট ব্যবহার করুন।
- আপনার async কলব্যাকে ভারী CPU কাজ ঢোকাবেন না — তারা প্রতিটা অন্য রিকোয়েস্টের সাথে ইভেন্ট-লুপ থ্রেড শেয়ার করে।