ব্লকিং বনাম নন-ব্লকিং এর ওভারভিউ

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 কাজ ঢোকাবেন না — তারা প্রতিটা অন্য রিকোয়েস্টের সাথে ইভেন্ট-লুপ থ্রেড শেয়ার করে।