ইলেকট্রন (Electron) অ্যাপ্লিকেশনে Background Process এবং Task Scheduling গুরুত্বপূর্ণ ভূমিকা পালন করে, বিশেষ করে যখন আপনি কিছু দীর্ঘ সময় চলা কার্যক্রম বা সময় নির্ধারিত কাজ সম্পাদন করতে চান। এ ধরনের কার্যক্রম অ্যাপ্লিকেশনের প্রধান UI বা ব্যবহারকারীর অভিজ্ঞতাকে বিঘ্নিত না করে কাজ করে। Electron এ, Main Process বা Renderer Process ব্যবহার করে ব্যাকগ্রাউন্ডে কাজ করার জন্য কিছু কৌশল রয়েছে।
১. Background Process
Background Process এমন প্রক্রিয়া যা অ্যাপ্লিকেশনের মুখ্য UI এর সাথে সরাসরি সম্পর্কিত না হয়ে, আলাদাভাবে কাজ করে। এটি সাধারণত সময়সীমিত বা দীর্ঘস্থায়ী কাজগুলির জন্য ব্যবহৃত হয়, যেমন:
- ডেটা প্রক্রিয়াকরণ।
- নেটওয়ার্কের সাথে যোগাযোগ।
- ফাইল সিস্টেমে কাজ করা।
- ব্যাকগ্রাউন্ডে লজিক চালানো।
Electron-এ, Background Process তৈরি করতে Main Process বা Renderer Process এর বাইরে কিছু কোড চালানো সম্ভব।
উদাহরণ: Main Process-এ Background Task
const { app, BrowserWindow } = require('electron');
// অ্যাপ্লিকেশন উইন্ডো তৈরি
let mainWindow;
app.on('ready', () => {
mainWindow = new BrowserWindow({
width: 800,
height: 600,
});
mainWindow.loadFile('index.html');
// Background Task: ফাইল লেখার জন্য ব্যাকগ্রাউন্ডে কাজ চলছে
setInterval(() => {
console.log('Background task running...');
// ফাইল বা ডেটা প্রক্রিয়াকরণ
}, 5000); // প্রতি 5 সেকেন্ড পর এটি চলবে
});
এখানে, setInterval() ব্যবহার করে একটি ব্যাকগ্রাউন্ড কাজ চালানো হচ্ছে যা প্রতি ৫ সেকেন্ড পর রান করবে। আপনি এই পদ্ধতিতে এমন কোড ব্যবহার করতে পারেন যেগুলি UI থ্রেডে অবিশ্বাস্যভাবে প্রভাব ফেলে না, কিন্তু কর্মক্ষম থাকে।
২. Task Scheduling
Task Scheduling হল একটি প্রক্রিয়া যেখানে আপনি নির্দিষ্ট সময় বা নির্দিষ্ট পরিসরে কিছু কাজ চালানোর জন্য শিডিউল করতে পারেন। Electron অ্যাপে task scheduling করতে setTimeout(), setInterval(), এবং node-cron লাইব্রেরি ব্যবহার করা যায়।
উদাহরণ ১: setTimeout() এবং setInterval()
setTimeout(): নির্দিষ্ট একটি সময় পর একটি একক কার্যক্রম চালায়।setInterval(): নির্দিষ্ট সময় অন্তর অন্তর কাজ চালিয়ে যায়।
// setTimeout() ব্যবহার করে একবার কাজ চালানো
setTimeout(() => {
console.log('This runs once after 3 seconds');
}, 3000); // 3 সেকেন্ড পর রান হবে
// setInterval() ব্যবহার করে বারবার কাজ চালানো
setInterval(() => {
console.log('This runs every 5 seconds');
}, 5000); // প্রতি 5 সেকেন্ড পর বারবার রান হবে
উদাহরণ ২: node-cron ব্যবহার করে টাস্ক শিডিউলিং
node-cron হল একটি জনপ্রিয় লাইব্রেরি যা দিয়ে নির্দিষ্ট সময়ে টাস্ক চালানোর জন্য cron job তৈরি করা যায়। এটি Main Process-এ ব্যবহার করা হয়।
- প্রথমে node-cron ইনস্টল করতে হবে:
npm install node-cron
- তারপর node-cron ব্যবহার করে কাজ শিডিউল করা:
const cron = require('node-cron');
// প্রতি মিনিটে কাজ চালানো
cron.schedule('* * * * *', () => {
console.log('Running task every minute');
});
// নির্দিষ্ট সময় অনুযায়ী কাজ চালানো (যেমন: প্রতি 6 ঘণ্টায়)
cron.schedule('0 */6 * * *', () => {
console.log('Running task every 6 hours');
});
এখানে, * * * * * হচ্ছে একটি cron expression যা প্রতি মিনিটে কাজ চালায়, এবং 0 */6 * * * ক্রন এক্সপ্রেশন প্রতি ৬ ঘণ্টায় কাজ চালানোর জন্য ব্যবহৃত হয়।
৩. Main Process এবং Renderer Process এর মধ্যে ব্যাকগ্রাউন্ড কাজ ভাগ করা
যদি আপনি একটি ব্যাকগ্রাউন্ড কাজ Renderer Process (যা UI পরিচালনা করে) থেকে আলাদা করে Main Process এ পরিচালনা করতে চান, তবে আপনি IPC (Inter-Process Communication) ব্যবহার করতে পারেন।
উদাহরণ: Main Process থেকে ব্যাকগ্রাউন্ড কাজ পরিচালনা
Main Process (main.js)
const { app, BrowserWindow, ipcMain } = require('electron');
const { exec } = require('child_process'); // ব্যাকগ্রাউন্ডে কাজ চালানোর জন্য
let mainWindow;
app.on('ready', () => {
mainWindow = new BrowserWindow({
width: 800,
height: 600,
});
mainWindow.loadFile('index.html');
// Renderer Process থেকে ব্যাকগ্রাউন্ড কাজ চালানোর অনুরোধ গ্রহণ
ipcMain.on('start-background-task', (event) => {
exec('node backgroundTask.js', (error, stdout, stderr) => {
if (error) {
console.error(`exec error: ${error}`);
return;
}
console.log(`stdout: ${stdout}`);
console.error(`stderr: ${stderr}`);
});
});
});
Renderer Process (index.html)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Electron App</title>
</head>
<body>
<button id="startTaskBtn">Start Background Task</button>
<script>
const { ipcRenderer } = require('electron');
document.getElementById('startTaskBtn').addEventListener('click', () => {
ipcRenderer.send('start-background-task'); // Main Process-এ ব্যাকগ্রাউন্ড কাজ শুরু করার জন্য মেসেজ পাঠানো
});
</script>
</body>
</html>
এখানে, Renderer Process থেকে Main Process-এ মেসেজ পাঠানো হচ্ছে, এবং সেখানে একটি ব্যাকগ্রাউন্ড কাজ (যেমন একটি আলাদা স্ক্রিপ্ট চালানো) শুরু হচ্ছে।
৪. ব্যাকগ্রাউন্ড প্রক্রিয়া এবং UI আপডেট
একটি ব্যাকগ্রাউন্ড প্রক্রিয়ার মাধ্যমে কিছু কাজ সম্পন্ন হলে, আপনি Main Process থেকে Renderer Process-এ ডেটা পাঠিয়ে UI আপডেট করতে পারেন।
উদাহরণ: ব্যাকগ্রাউন্ড কাজের সাফল্য UI-তে প্রদর্শন
Main Process (main.js)
const { app, BrowserWindow, ipcMain } = require('electron');
const { exec } = require('child_process'); // ব্যাকগ্রাউন্ড কাজের জন্য
let mainWindow;
app.on('ready', () => {
mainWindow = new BrowserWindow({
width: 800,
height: 600,
});
mainWindow.loadFile('index.html');
// ব্যাকগ্রাউন্ড কাজ শেষ হলে Renderer Process-এ সাড়া পাঠানো
ipcMain.on('start-background-task', (event) => {
exec('node backgroundTask.js', (error, stdout, stderr) => {
if (error) {
console.error(`exec error: ${error}`);
return;
}
event.reply('background-task-result', stdout); // ব্যাকগ্রাউন্ড কাজের ফলাফল Renderer Process-এ পাঠানো
});
});
});
Renderer Process (index.html)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Electron App</title>
</head>
<body>
<button id="startTaskBtn">Start Background Task</button>
<p id="result"></p>
<script>
const { ipcRenderer } = require('electron');
document.getElementById('startTaskBtn').addEventListener('click', () => {
ipcRenderer.send('start-background-task'); // ব্যাকগ্রাউন্ড কাজ শুরু করার জন্য
});
ipcRenderer.on('background-task-result', (event, result) => {
document.getElementById('result').textContent = result; // UI তে ফলাফল দেখানো
});
</script>
</body>
</html>
এখানে, background-task-result নামক একটি ইভেন্ট ব্যবহার করা হচ্ছে, যার মাধ্যমে Main Process থেকে ব্যাকগ্রাউন্ড কাজের ফলাফল Renderer Process-এ পাঠানো হচ্ছে।
সারাংশ
- Background Process: Electron অ্যাপে ব্যাকগ্রাউন্ডে চলা প্রক্রিয়া, যা UI-কে বিঘ্নিত না করে কাজ করে।
- Task Scheduling:
setTimeout()এবংsetInterval()ব্যবহার করে কাজ নির্ধারিত সময়ে বা নির্দিষ্ট সময় অন্তর অন্তর চালানো যায়। - node-cron: ক্রন কাজের জন্য
node-cronলাইব্রেরি ব্যবহার করা যেতে পারে। - Main Process এবং Renderer Process এর মধ্যে যোগাযোগ: IPC ব্যবহার করে ব্যাকগ্রাউন্ড কাজের সাফল্য UI-তে দেখানো সম্ভব।
এভাবে, আপনি Electron অ্যাপ্লিকেশনে ব্যাকগ্রাউন্ড প্রক্রিয়া এবং টাস্ক শিডিউলিং পরিচালনা করতে পারেন, যা অ্যাপ্লিকেশনটির পারফরম্যান্স এবং ব্যবহারকারীর অভিজ্ঞতাকে উন্নত করে।
ইলেকট্রন অ্যাপ্লিকেশনে background tasks তৈরি করা একটি গুরুত্বপূর্ণ প্রক্রিয়া যা অ্যাপের ব্যাকগ্রাউন্ডে কিছু কাজ চালানোর জন্য ব্যবহৃত হয়। এগুলো সাধারণত অ্যাপের প্রধান UI তে ব্যাঘাত না ঘটিয়ে এক্সটার্নাল বা ব্যাকগ্রাউন্ড কাজগুলো চালানোর জন্য ব্যবহৃত হয়, যেমন ডেটা ফেচিং, ফাইল প্রসেসিং, বা কোনো দীর্ঘ-running প্রসেস।
Electron অ্যাপ্লিকেশনে ব্যাকগ্রাউন্ড টাস্ক তৈরি করতে Main Process ব্যবহার করা হয়। এটি setTimeout, setInterval, Promise এবং অন্যান্য অ্যাসিঙ্ক্রোনাস ফাংশনগুলির মাধ্যমে ব্যাকগ্রাউন্ড কাজ সম্পাদন করতে পারে।
নিচে ব্যাকগ্রাউন্ড টাস্ক তৈরি করার কয়েকটি পদ্ধতি এবং উদাহরণ দেওয়া হলো।
১. Main Process এ ব্যাকগ্রাউন্ড টাস্ক তৈরি করা
Main Process এ ব্যাকগ্রাউন্ড টাস্ক চালানোর জন্য আপনি সাধারণত setInterval() বা setTimeout() ব্যবহার করতে পারেন। এই ফাংশনগুলি ব্যাকগ্রাউন্ডে কোড চালাতে সহায়ক।
উদাহরণ: setInterval() ব্যবহার করে ব্যাকগ্রাউন্ড টাস্ক
const { app, BrowserWindow, ipcMain } = require('electron');
let mainWindow;
let backgroundTaskInterval;
app.on('ready', () => {
mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
nodeIntegration: true
}
});
mainWindow.loadFile('index.html');
// ব্যাকগ্রাউন্ড টাস্ক শুরু করা
backgroundTaskInterval = setInterval(() => {
console.log("ব্যাকগ্রাউন্ড টাস্ক চলছে...");
mainWindow.webContents.send('background-task', 'ব্যাকগ্রাউন্ড টাস্ক চলছে...');
}, 5000); // প্রতি 5 সেকেন্ড পর পর টাস্ক চালাবে
// অ্যাপ বন্ধ হলে ব্যাকগ্রাউন্ড টাস্ক বন্ধ করা
app.on('before-quit', () => {
clearInterval(backgroundTaskInterval); // ব্যাকগ্রাউন্ড টাস্ক বন্ধ করা
console.log('ব্যাকগ্রাউন্ড টাস্ক বন্ধ');
});
});
এই কোডে, setInterval() ব্যবহার করা হয়েছে ব্যাকগ্রাউন্ডে প্রতি 5 সেকেন্ড পর পর একটি টাস্ক চালানোর জন্য, যা কনসোলে "ব্যাকগ্রাউন্ড টাস্ক চলছে..." মেসেজ দেখাবে এবং Renderer Process-এ মেসেজ পাঠাবে।
২. Renderer Process এ ব্যাকগ্রাউন্ড টাস্ক থেকে ডেটা গ্রহণ করা
Renderer Process-এ সেই ব্যাকগ্রাউন্ড টাস্কের ডেটা গ্রহণ করতে ipcRenderer ব্যবহৃত হবে।
উদাহরণ: Renderer Process (index.html)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Background Task Example</title>
</head>
<body>
<h1>Electron Background Task Example</h1>
<p id="taskStatus">ব্যাকগ্রাউন্ড টাস্ক চলছে না।</p>
<script>
const { ipcRenderer } = require('electron');
// Main Process থেকে ব্যাকগ্রাউন্ড টাস্কের ডেটা গ্রহণ করা
ipcRenderer.on('background-task', (event, message) => {
document.getElementById('taskStatus').textContent = message;
});
</script>
</body>
</html>
এখানে, ipcRenderer.on('background-task') ইভেন্ট ব্যবহার করে Main Process থেকে পাঠানো মেসেজ গ্রহণ করা হচ্ছে এবং Renderer Process-এ সেই মেসেজ প্রদর্শন করা হচ্ছে।
৩. ব্যাকগ্রাউন্ড টাস্কে Promises এবং async/await ব্যবহার করা
ব্যাকগ্রাউন্ড টাস্কের কাজ সিঙ্ক্রোনাস (synchronous) বা অ্যাসিঙ্ক্রোনাস (asynchronous) হতে পারে। অ্যাসিঙ্ক্রোনাস কাজের জন্য আপনি Promises এবং async/await ব্যবহার করতে পারেন।
উদাহরণ: async/await ব্যবহার করে ব্যাকগ্রাউন্ড টাস্ক
const { app, BrowserWindow, ipcMain } = require('electron');
let mainWindow;
app.on('ready', () => {
mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
nodeIntegration: true
}
});
mainWindow.loadFile('index.html');
// অ্যাসিঙ্ক্রোনাস ব্যাকগ্রাউন্ড টাস্ক
async function backgroundTask() {
console.log("ব্যাকগ্রাউন্ড টাস্ক শুরু");
let result = await new Promise((resolve, reject) => {
setTimeout(() => {
resolve("ব্যাকগ্রাউন্ড টাস্ক সম্পন্ন");
}, 5000); // 5 সেকেন্ড পরে টাস্ক সম্পন্ন
});
// Main Process থেকে Renderer Process-এ ফলাফল পাঠানো
mainWindow.webContents.send('background-task', result);
}
// ব্যাকগ্রাউন্ড টাস্ক চালানো
backgroundTask();
});
এখানে, async/await ব্যবহার করে ব্যাকগ্রাউন্ড টাস্ক তৈরি করা হয়েছে। Promise ব্যবহার করে একটি 5 সেকেন্ডের বিরতি রেখে টাস্ক সম্পন্ন হবে এবং Renderer Process-এ ফলাফল পাঠানো হবে।
৪. ব্যাকগ্রাউন্ড টাস্কের জন্য Web Worker ব্যবহার করা
একটি বড় ব্যাকগ্রাউন্ড টাস্ক চলানোর জন্য Web Worker ব্যবহার করা যেতে পারে। এটি মূল UI থ্রেড থেকে আলাদা একটি থ্রেডে কাজ করে, যা অ্যাপের পারফরম্যান্সে কোনো প্রভাব ফেলবে না। তবে, Electron এ Web Worker মূলত Renderer Process-এ ব্যবহৃত হয় এবং Main Process এর সাথে যোগাযোগের জন্য IPC ব্যবহার করা হয়।
উদাহরণ: Web Worker ব্যবহার করা
Main Process (main.js)
const { app, BrowserWindow, ipcMain } = require('electron');
let mainWindow;
app.on('ready', () => {
mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
nodeIntegration: true
}
});
mainWindow.loadFile('index.html');
// Web Worker তে কাজ পাঠানো
ipcMain.on('start-worker', (event) => {
mainWindow.webContents.executeJavaScript(`
const worker = new Worker('worker.js');
worker.onmessage = function(e) {
console.log('Worker says:', e.data);
worker.terminate(); // কাজ শেষ হলে থামান
};
worker.postMessage('Start worker task');
`);
});
});
Renderer Process (worker.js)
onmessage = function(e) {
console.log('Received from Main:', e.data);
// দীর্ঘ-running কাজ বা গণনা
setTimeout(() => {
postMessage('Worker task complete');
}, 3000); // 3 সেকেন্ড পরে কাজ শেষ
};
সারাংশ
- Main Process-এ
setInterval(),setTimeout(), Promises, এবং async/await ব্যবহার করে ব্যাকগ্রাউন্ড টাস্ক তৈরি করা যায়। ipcMainএবংipcRendererব্যবহার করে Main Process এবং Renderer Process এর মধ্যে ডেটা আদান-প্রদান করা হয়।- Web Worker ব্যবহার করে দীর্ঘ-running ব্যাকগ্রাউন্ড টাস্কগুলো আলাদা থ্রেডে সম্পাদন করা যায়, যা মূল UI থ্রেডকে ব্যাহত না করে কাজ করতে সাহায্য করে।
এভাবে, আপনি Electron অ্যাপ্লিকেশনে কার্যকরী ব্যাকগ্রাউন্ড টাস্ক তৈরি করে ইউজার ইন্টারফেসের পারফরম্যান্স উন্নত করতে পারেন।
Electron অ্যাপ্লিকেশনে, Main Process সাধারণত অ্যাপ্লিকেশনের সমস্ত গুরুত্বপূর্ণ কার্যক্রম পরিচালনা করে, যেমন উইন্ডো তৈরি করা, ফাইল সিস্টেমে কাজ করা, নেটওয়ার্ক রিকোয়েস্ট পাঠানো ইত্যাদি। তবে, কিছু কাজ যেমন ভারী গণনা বা দীর্ঘস্থায়ী অপারেশন (যেমন ফাইল ইওপি, ডেটাবেস কুয়েরি, ইত্যাদি) সরাসরি Main Process-এ করা হলে অ্যাপ্লিকেশনের পারফরম্যান্সে প্রভাব ফেলতে পারে।
এক্ষেত্রে, Background Worker বা Worker Threads ব্যবহৃত হয়, যা Main Process-কে ভারী কাজ থেকে মুক্তি দিতে সাহায্য করে। এটি Node.js এর Worker Threads মডিউল ব্যবহার করে এবং Main Process এবং Renderer Process এর মধ্যে পারফরম্যান্স অপ্টিমাইজেশন করে।
১. Worker Threads কী?
Worker Threads হলো Node.js এর একটি ফিচার, যা আপনি সিঙ্গেল থ্রেডে বড় বড় কাজ না চালিয়ে, অন্য একটি থ্রেডে কাজ করতে ব্যবহার করতে পারেন। এটি ভারী গণনা বা ইনপুট/আউটপুট অপারেশন সম্পন্ন করার জন্য ব্যবহৃত হয়।
Electron অ্যাপ্লিকেশনে, আপনি Main Process-এ Worker Threads ব্যবহার করে ব্যাকগ্রাউন্ডে কাজ করতে পারেন, যাতে মূল UI থ্রেডে কোনও লকিং বা ব্লকিং না ঘটে।
২. Electron এ Worker Threads ব্যবহার করা
প্রথমে, আপনার Main Process-এ Worker Threads ইমপোর্ট করতে হবে। তারপর, আপনি কাজটি Worker Thread-এ পাঠিয়ে Main Process-কে অবাধ রাখতে পারবেন।
উদাহরণ: Worker Thread ব্যবহার করা
Main Process (main.js)
const { app, BrowserWindow } = require('electron');
const { Worker, isMainThread, parentPort } = require('worker_threads');
let mainWindow;
app.on('ready', () => {
mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
nodeIntegration: true,
},
});
mainWindow.loadFile('index.html');
// Background Worker এর ব্যবহার
if (isMainThread) {
// যদি Main Thread এ থাকি, Worker Thread তৈরি করা
const worker = new Worker(__filename); // একই স্ক্রিপ্ট ফাইল ব্যবহার করা হচ্ছে
// Worker কে ডেটা পাঠানো
worker.postMessage('Hello from Main Process');
// Worker থেকে আসা মেসেজ গ্রহণ করা
worker.on('message', (message) => {
console.log('Main Thread থেকে Worker Thread থেকে মেসেজ:', message);
});
// Worker Error হ্যান্ডলিং
worker.on('error', (error) => {
console.error('Error from Worker:', error);
});
// Worker Process End হ্যান্ডলিং
worker.on('exit', (code) => {
if (code !== 0) {
console.error(`Worker stopped with exit code ${code}`);
}
});
}
});
এখানে Main Process থেকে একটি নতুন Worker তৈরি করা হচ্ছে। এই Worker অন্য একটি থ্রেডে কাজ করবে এবং Main Process এর সাথে মেসেজ আদান-প্রদান করবে।
Worker Thread - ব্যাকগ্রাউন্ড থ্রেড
const { parentPort } = require('worker_threads');
// Worker Thread থেকে আসা মেসেজ গ্রহণ করা
parentPort.on('message', (message) => {
console.log('Worker Thread থেকে Main Process থেকে মেসেজ:', message);
// Worker Thread থেকে মেসেজ পাঠানো
parentPort.postMessage('Hello from Worker');
});
এখানে, Worker থ্রেড Main Process থেকে মেসেজ গ্রহণ করছে এবং সাড়া পাঠাচ্ছে। এই সাড়া Main Process এ ফিরে আসবে।
৩. বড় কাজের জন্য Worker Threads
আপনি যখন বড় বা দীর্ঘস্থায়ী কাজ করতে চান, যেমন বড় ফাইল পড়া, বড় ডেটা প্রসেসিং, বা কোনও ব্লকিং নেটওয়ার্ক অপারেশন, তখন সেগুলি Worker Thread-এ পাঠানোর মাধ্যমে মূল থ্রেড বা UI থ্রেড মুক্ত রাখা সম্ভব।
উদাহরণ: গণনা করা (ব্যাকগ্রাউন্ডে)
ধরা যাক, আপনি খুব বড় সংখ্যার গুণফল গণনা করতে চান যা UI থ্রেড ব্লক করবে না।
// WorkerThread.js - Worker Threads ফাইল
const { parentPort } = require('worker_threads');
function heavyComputation() {
let result = 0;
for (let i = 0; i < 1e9; i++) {
result += i;
}
return result;
}
// Main Process থেকে মেসেজ গ্রহণ
parentPort.on('message', () => {
const result = heavyComputation();
parentPort.postMessage(`Calculation result: ${result}`);
});
এখানে, Worker Thread একটি ভারী গণনা কাজ করছে, যাতে Main Process UI বা অন্য কাজ থামিয়ে না থাকে।
৪. Main Process এ Worker Threads এর সাথে Communication
Worker Threads এবং Main Process এর মধ্যে IPC (Inter-Process Communication) ব্যবহার করা হয়। এটি তাদের মধ্যে ডেটা আদান-প্রদান করতে সাহায্য করে।
- postMessage(): Worker Thread থেকে Main Process এ মেসেজ পাঠাতে ব্যবহার করা হয়।
- on('message'): Worker Thread এ মেসেজ গ্রহণ করা হয়।
- parentPort.postMessage(): Worker Thread থেকে সাড়া পাঠানো হয়।
সারাংশ
- Worker Threads ব্যবহার করে Main Process থেকে ভারী গণনা বা দীর্ঘস্থায়ী কাজ ব্যাকগ্রাউন্ডে চালানো যায়, যাতে UI থ্রেডে কোনো ব্লকিং না ঘটে।
- Worker Threads এবং Main Process এর মধ্যে IPC (Inter-Process Communication) এর মাধ্যমে মেসেজ আদান-প্রদান করা হয়।
- Worker Threads ফাইলের মাধ্যমে থ্রেড তৈরি করা এবং কাজের পরে সেগুলি বন্ধ করা হয়।
এই পদ্ধতিতে আপনি আপনার Electron অ্যাপ্লিকেশনের পারফরম্যান্স উন্নত করতে পারেন এবং ব্যবহারকারীর অভিজ্ঞতা আরও মসৃণ এবং দ্রুত করতে পারেন।
ক্রোন জব বা শিডিউলড টাস্ক হল এমন একটি কাজ যা নির্দিষ্ট সময় বা নির্দিষ্ট অন্তরালে চালানোর জন্য সেট করা হয়। Electron অ্যাপ্লিকেশনে, আপনি Node.js এর cron লাইব্রেরি বা অন্য শিডিউলিং টুল ব্যবহার করে এ ধরনের টাস্ক তৈরি করতে পারেন।
১. cron লাইব্রেরি ব্যবহার
cron লাইব্রেরি Node.js এ একটি জনপ্রিয় প্যাকেজ যা আপনাকে শিডিউলড টাস্ক তৈরি করতে সহায়ক হয়। এটি ঠিক একইভাবে কাজ করে যেভাবে লিনাক্স/ইউনিক্স সিস্টেমে ক্রোন ব্যবহার করা হয়।
cron লাইব্রেরি ইনস্টল করা
প্রথমে, cron প্যাকেজটি আপনার Electron অ্যাপ্লিকেশনে ইনস্টল করতে হবে।
npm install cron
ইউজার উদাহরণ - ক্রোন জব তৈরি করা
এখানে, আমরা একটি শিডিউলড টাস্ক তৈরি করবো যা প্রতি 5 মিনিটে একটি মেসেজ লগ করবে।
Main Process - main.js
const { app, BrowserWindow } = require('electron');
const { CronJob } = require('cron'); // cron লাইব্রেরি ইম্পোর্ট
let mainWindow;
app.on('ready', () => {
mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
nodeIntegration: true
},
});
mainWindow.loadFile('index.html');
// ক্রোন জব তৈরি
const job = new CronJob('*/5 * * * *', function() {
console.log('এটি প্রতি 5 মিনিটে চালিত হবে!');
});
// ক্রোন জব শুরু করা
job.start();
});
এখানে, CronJob কনস্ট্রাক্টরটি একটি নতুন ক্রোন জব তৈরি করে। তারপরে, job.start() দিয়ে এটি চালু করা হয়।
ক্রোন স্ট্রিং '*/5 * * * *' এইভাবে ব্যাখ্যা করা যায়:
*/5: প্রতি 5 মিনিটে।* * * *: প্রতিটি ঘণ্টা, দিন, মাস এবং সপ্তাহের দিন।
২. মনে রাখার বিষয়
- Cron Syntax: ক্রোন স্ট্রিংয়ে 5টি স্থান রয়েছে, প্রতিটি ক্ষেত্রের জন্য আপনাকে একটি মান দিতে হবে:
- ১ম: মিনিট (০ - ৫৯)
- ২য়: ঘণ্টা (০ - ২৩)
- ৩য়: দিন (১ - ৩১)
- ৪র্থ: মাস (০ - ১১)
- ৫ম: সপ্তাহের দিন (০ - ৬, যেখানে ০ রবিবার)
উদাহরণ:
'*/5 * * * *': প্রতি ৫ মিনিটে টাস্ক চলবে।'0 0 * * *': প্রতি দিন মধ্যরাতে টাস্ক চলবে।
৩. Electron অ্যাপ্লিকেশনে ক্রোন জব নিয়ন্ত্রণ
আপনি চাইলে আপনার Electron অ্যাপ্লিকেশন চালু থাকাকালীন সময়ে একটি নির্দিষ্ট সময় পরে শিডিউলড টাস্ক বন্ধ বা পরিবর্তন করতে পারেন।
ক্রোন জব বন্ধ করা
job.stop(); // ক্রোন জব বন্ধ করা
ক্রোন জব পুনরায় শুরু করা
job.start(); // ক্রোন জব আবার শুরু করা
৪. ইউজারের চাহিদা অনুযায়ী ক্রোন জব তৈরি করা
আপনি চাইলে শিডিউলড টাস্ক এ আরো পরিবর্তন করতে পারেন, যেমন:
- প্রতিদিন একই সময়ে টাস্ক চালানো।
- নির্দিষ্ট দিনের জন্য টাস্ক চালানো।
প্রতিদিন একই সময়ে টাস্ক চালানো
const dailyJob = new CronJob('0 9 * * *', function() {
console.log('এই টাস্কটি প্রতিদিন সকাল ৯ টায় চালিত হবে!');
});
dailyJob.start();
শুক্রবার ৫টায় টাস্ক চালানো
const fridayJob = new CronJob('0 17 * * 5', function() {
console.log('এই টাস্কটি শুক্রবার বিকাল ৫ টায় চালিত হবে!');
});
fridayJob.start();
৫. node-schedule লাইব্রেরি ব্যবহার
এছাড়াও, আপনি node-schedule নামক একটি প্যাকেজ ব্যবহার করতে পারেন যা আরও উন্নত শিডিউলিং সমর্থন প্রদান করে এবং উন্নত টাইমজোন এবং কাস্টম টাইম সেটিংস সমর্থন করে।
node-schedule ইনস্টল করা
npm install node-schedule
node-schedule ব্যবহার করা
const schedule = require('node-schedule');
// প্রতিদিন সকাল ৮টায় কাজ শুরু করা
const job = schedule.scheduleJob('0 8 * * *', function(){
console.log('প্রতিদিন সকাল ৮টায় কাজ শুরু হচ্ছে!');
});
সারাংশ
- ক্রোন জব বা শিডিউলড টাস্ক তৈরি করতে cron বা node-schedule প্যাকেজ ব্যবহার করা যায়।
CronJobলাইব্রেরি প্রতি মিনিট, ঘণ্টা, দিন, মাসের মধ্যে নির্দিষ্ট সময়ে কাজ চালাতে সাহায্য করে।- আপনি Electron অ্যাপ এর মধ্যে শিডিউলড টাস্ক তৈরি করে বিভিন্ন ধরনের পটেনশিয়াল টাস্ক যেমন নিয়মিত ডেটা সিঙ্ক, নোটিফিকেশন পাঠানো ইত্যাদি কাজ করতে পারেন।
Electron অ্যাপ্লিকেশনগুলিতে Background Task (ব্যাকগ্রাউন্ড কাজ) চালানো অনেক গুরুত্বপূর্ণ হতে পারে, বিশেষত যখন আপনি বড় ডেটা প্রসেসিং, নেটওয়ার্ক অপারেশন বা দীর্ঘ সময় ধরে চলা কাজ করতে চান যা UI থ্রেডকে ব্যস্ত না রাখে। এটি নিশ্চিত করার জন্য, Electron এর IPC (Inter-Process Communication) ব্যবহৃত হয়, যা Main Process এবং Renderer Process এর মধ্যে সঠিকভাবে যোগাযোগ স্থাপন করতে সাহায্য করে।
IPC ব্যবহার করে, আপনি Renderer Process থেকে Main Process-এ ব্যাকগ্রাউন্ড কাজের জন্য অনুরোধ পাঠাতে পারেন, এবং Main Process সেই কাজটি সম্পন্ন করে তার ফলাফল Renderer Process-এ পাঠাতে পারে।
IPC ব্যবহার করে Background Task এর জন্য কনফিগারেশন
১. ব্যাকগ্রাউন্ড কাজের জন্য ipcMain এবং ipcRenderer ব্যবহার করা
Electron অ্যাপে Renderer Process ব্যবহারকারী ইন্টারফেস (UI) চালায়, এবং Main Process ব্যাকগ্রাউন্ড কার্যক্রম পরিচালনা করে, যেমন ফাইল অপারেশন, নেটওয়ার্ক অনুরোধ, ডেটাবেস এক্সেস ইত্যাদি। এই কাজগুলো সাধারণত Main Process-এ করা হয়, কারণ Renderer Process UI তে ফোকাস করা উচিত।
এখানে ipcMain (Main Process) এবং ipcRenderer (Renderer Process) ব্যবহার করে ব্যাকগ্রাউন্ড কাজের একটি সাধারণ উদাহরণ দেওয়া হয়েছে।
২. Main Process এ ব্যাকগ্রাউন্ড কাজ চালানো
Main Process এ আমরা ipcMain ব্যবহার করে ব্যাকগ্রাউন্ড কাজ শুরু করব এবং setTimeout বা setInterval এর মতো ফাংশন ব্যবহার করে কাজগুলো সঞ্চালিত হবে। ব্যাকগ্রাউন্ড কাজ শেষ হলে event.reply() ব্যবহার করে ফলাফল Renderer Process এ পাঠানো হবে।
উদাহরণ: Main Process (main.js)
const { app, BrowserWindow, ipcMain } = require('electron');
let mainWindow;
app.on('ready', () => {
mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
nodeIntegration: true,
},
});
mainWindow.loadFile('index.html');
// Renderer থেকে ব্যাকগ্রাউন্ড কাজের অনুরোধ গ্রহণ করা
ipcMain.on('start-background-task', (event) => {
console.log('ব্যাকগ্রাউন্ড কাজ শুরু হচ্ছে...');
// ব্যাকগ্রাউন্ড কাজ (যেমন ডেটা প্রসেসিং বা লম্বা সময় নেয়ার কাজ)
setTimeout(() => {
console.log('ব্যাকগ্রাউন্ড কাজ শেষ!');
event.reply('background-task-completed', 'ব্যাকগ্রাউন্ড কাজ সম্পন্ন হয়েছে');
}, 5000); // 5 সেকেন্ডের জন্য ব্যাকগ্রাউন্ড কাজ
});
});
এই কোডে, Main Process একটি ব্যাকগ্রাউন্ড কাজ শুরু করে, যা ৫ সেকেন্ড সময় নেবে। এর পর, event.reply() ব্যবহার করে কাজের সফলতা Renderer Process এ পাঠানো হচ্ছে।
৩. Renderer Process থেকে ব্যাকগ্রাউন্ড কাজের জন্য অনুরোধ পাঠানো
Renderer Process থেকে Main Process-এ ব্যাকগ্রাউন্ড কাজের জন্য একটি অনুরোধ পাঠানো হবে ipcRenderer.send() ব্যবহার করে, এবং পরে ipcRenderer.on() এর মাধ্যমে ফলাফল গ্রহণ করা হবে।
উদাহরণ: Renderer Process (index.html)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Background Task Example</title>
</head>
<body>
<h1>Electron ব্যাকগ্রাউন্ড কাজ</h1>
<button id="startBtn">ব্যাকগ্রাউন্ড কাজ শুরু করুন</button>
<p id="status">এখনো কাজ শুরু হয়নি...</p>
<script>
const { ipcRenderer } = require('electron');
// ব্যাকগ্রাউন্ড কাজ শুরু করার জন্য বাটনে ইভেন্ট
document.getElementById('startBtn').addEventListener('click', () => {
ipcRenderer.send('start-background-task'); // Main Process-এ কাজের অনুরোধ পাঠানো
});
// Main Process থেকে কাজের ফলাফল গ্রহণ করা
ipcRenderer.on('background-task-completed', (event, message) => {
document.getElementById('status').textContent = message; // ফলাফল UI-তে দেখানো
});
</script>
</body>
</html>
এখানে, Renderer Process থেকে Main Process-এ ipcRenderer.send() ব্যবহার করে একটি অনুরোধ পাঠানো হচ্ছে, যাতে Main Process ব্যাকগ্রাউন্ড কাজ শুরু করে। যখন কাজ শেষ হবে, তখন ipcRenderer.on() এর মাধ্যমে ফলাফল গ্রহণ করা হবে এবং UI-তে দেখানো হবে।
৪. ব্যাকগ্রাউন্ড কাজের জন্য অন্যান্য ফাংশন ব্যবহার
আপনি setInterval(), fs, child_process বা অন্যান্য Node.js ফাংশন ব্যবহার করে আরও জটিল ব্যাকগ্রাউন্ড কাজ করতে পারেন। উদাহরণস্বরূপ:
- ফাইল সিস্টেম অপারেশন:
fs.readFile(),fs.writeFile()ইত্যাদি। - নেটওয়ার্ক অনুরোধ:
http,axiosবাfetch। - বহু প্রক্রিয়ার কাজ:
child_processব্যবহার করে মূল অ্যাপ্লিকেশনের বাইরের স্ক্রিপ্ট চালানো।
উদাহরণ: Child Process ব্যবহার করে ব্যাকগ্রাউন্ড কাজ
const { exec } = require('child_process');
// ব্যাকগ্রাউন্ডে কমান্ড চালানো
exec('ls', (error, stdout, stderr) => {
if (error) {
console.error(`exec error: ${error}`);
return;
}
console.log(`stdout: ${stdout}`);
console.log(`stderr: ${stderr}`);
});
এখানে exec() ব্যবহার করে child process তৈরি করা হচ্ছে, যা ব্যাকগ্রাউন্ডে একটি কমান্ড চালায় এবং এর আউটপুট দেখায়।
৫. ব্যাকগ্রাউন্ড কাজের ফলাফল সংগ্রহ করা
কোনো ব্যাকগ্রাউন্ড কাজের শেষে ফলাফল সংগ্রহ করার জন্য, event.reply() বা ipcRenderer.on() ব্যবহার করা হয়। যেমন ফাইল পড়া, নেটওয়ার্ক অনুরোধ বা অন্য কোনো সময়সাপেক্ষ কাজ শেষ হলে, ফলাফল বা ত্রুটির বার্তা UI তে পাঠানো হয়।
সারাংশ
- Main Process এবং Renderer Process এর মধ্যে IPC (Inter-Process Communication) ব্যবহার করে ব্যাকগ্রাউন্ড কাজ পরিচালনা করা যায়।
- Renderer Process থেকে Main Process-এ ব্যাকগ্রাউন্ড কাজের জন্য অনুরোধ পাঠানো হয় এবং পরে কাজের ফলাফল গ্রহণ করা হয়।
- setTimeout(), setInterval(), fs এবং child_process ব্যবহার করে ব্যাকগ্রাউন্ড কাজ সম্পন্ন করা হয়।
- event.reply() এবং ipcRenderer.on() ব্যবহার করে কাজের ফলাফল UI-তে পাঠানো হয়।
এভাবে, Electron অ্যাপে ব্যাকগ্রাউন্ড কাজ পরিচালনা করার জন্য IPC একটি শক্তিশালী এবং কার্যকরী পদ্ধতি।
Read more