সিঙ্ক্রোনাস এবং অ্যাসিনক্রোনাস প্রোগ্রামিং (নোড.জেএস) এর মধ্যে পার্থক্য কী?


189

আমি পড়ছি নোডবেগিনার পড়ছি এবং আমি নিম্নলিখিত দুটি টুকরো কোডটি দেখতে পেয়েছি।

প্রথমটি:

    var result = database.query("SELECT * FROM hugetable");
    console.log("Hello World");

দ্বিতীয়টি:

    database.query("SELECT * FROM hugetable", function(rows) {
       var result = rows;
    });
    console.log("Hello World");

আমি তাদের যা করার কথা বলেছিলাম তা পেয়েছি, তারা ক্যোয়ারীর উত্তর পুনরুদ্ধার করতে ডাটাবেসটিকে জিজ্ঞাসা করে। এবং তারপরconsole.log('Hello world')

প্রথমটি হ'ল সিঙ্ক্রোনাস কোড। এবং দ্বিতীয়টি হ'ল অ্যাসিক্রোনাস কোড।

দুটি টুকরোটির মধ্যে পার্থক্যটি আমার কাছে খুব অস্পষ্ট। আউটপুট কি হবে?

অ্যাসিঙ্ক্রোনাস প্রোগ্রামিংয়ে গুগলিং আমার পক্ষেও সহায়তা করেনি।


41
স্ট্যাঞ্জ আপনি গুগলের সাথে কিছুই খুঁজে পান নি, এটি বরং একটি বড় বিষয়। সিঙ্ক্রোনাস প্রোগ্রামিংয়ে, প্রতিটি পদক্ষেপটি পূর্ববর্তীটি সম্পাদন শেষ হওয়ার পরে একটি করা হয়। অ্যাসিঙ্ক্রোনিয়াসে, পদক্ষেপ 1 সমাপ্ত না হওয়া সত্ত্বেও পদক্ষেপ 2 সম্পাদন করা হবে। আপনার দ্বিতীয় উদাহরণে আপনি যে ফাংশনটি সংজ্ঞায়িত দেখছেন তাকে কলব্যাক ফাংশন বলা হয় এবং এটি ডাটাবেস থেকে ফলাফল ফিরে আসার সাথে সাথে চালানো হবে যা সম্ভবত কনসোল.লগ চালানোর পরে হবে।
লরেন্ট এস।

7
@ বার্টডুড অ্যাসিক্রোনাস প্রোগ্রামিংয়ের বিষয়ে অনেক কিছু ছিল, তবে এটি কী এবং বাস্তবে এর অর্থ কী তা নিয়ে কিছুটা সহজ ব্যাখ্যা দেওয়া হয়নি।
আজিরাহ

1
@ গ্যাব্রিয়েললামাসকে কেন আমরা সিঙ্ক্রোনাস ফাংশন এড়ানো উচিত?
চার্লি পার্কার

3
@ চার্লিপার্কার কারণ তারা ইভেন্টটির লুপটিকে অবরুদ্ধ করে এবং আপনি একটি অ্যাসিনক্রোনাস সন্নিবিষ্ট I / O মডেল থেকে সমস্ত সুবিধা হারাচ্ছেন। এবং কারণ এটি একটি খারাপ অভ্যাস। এটি এইভাবে চিন্তা করুন: আপনি যদি অ্যাসিক্রোনাস ফাংশন ব্যবহার না করেন তবে আপনি কেন নোড.জেএস ব্যবহার করছেন?
গ্যাব্রিয়েল লালামাস

1
@ গ্যাব্রিয়েল্লামাস, যদি আমি একটি INSERT কোয়েরি চালাচ্ছি এবং আমি সর্বশেষ IDোকানো আইডিটি পরে ব্যবহার করতে চাই, তবে আমাকে এটিকে সমকালীনভাবে বলা database.query()উচিত, তাই না? বা পদ্ধতির কী হওয়া উচিত? (এই প্রশ্নটি আমার দীর্ঘদিনের জন্য)
সান

উত্তর:


225

পার্থক্যটি হ'ল প্রথম উদাহরণে প্রোগ্রামটি প্রথম লাইনে ব্লক হয়ে যাবে। পরবর্তী লাইন (console.log ) অপেক্ষা করতে হবে।

ইন দ্বিতীয় উদাহরণ ,console.log যখন কোয়েরি প্রক্রিয়া করা হচ্ছে মৃত্যুদন্ড কার্যকর করা হবে না। অর্থাত, আপনার প্রোগ্রামটি অন্য কাজগুলি করার সময়, ক্যোয়ারীটি ব্যাকগ্রাউন্ডে প্রক্রিয়া করা হবে এবং কোয়েরি ডেটা প্রস্তুত হয়ে গেলে আপনি এটি দিয়ে যা চান তা করতে পারবেন।

সুতরাং, সংক্ষেপে: প্রথম উদাহরণটি ব্লক করবে, যখন দ্বিতীয়টি তা করবে না।

নিম্নলিখিত দুটি উদাহরণের আউটপুট:

// Example 1 - Synchronous (blocks)
var result = database.query("SELECT * FROM hugetable");
console.log("Query finished");
console.log("Next line");


// Example 2 - Asynchronous (doesn't block) 
database.query("SELECT * FROM hugetable", function(result) {
    console.log("Query finished");
});
console.log("Next line");

হবে:

  1. Query finished
    Next line
  2. Next line
    Query finished

দ্রষ্টব্য
নোড নিজেই একক থ্রেডেড থাকা অবস্থায় কিছু কাজ রয়েছে যা সমান্তরালভাবে চলতে পারে। উদাহরণস্বরূপ, ফাইল সিস্টেম অপারেশনগুলি একটি পৃথক প্রক্রিয়াতে ঘটে।

এজন্য নোড অ্যাসিঙ্ক অপারেশনগুলি করতে পারে: একটি থ্রেড ফাইল সিস্টেম অপারেশন করছে, যখন প্রধান নোড থ্রেড আপনার জাভাস্ক্রিপ্ট কোডটি চালিয়ে যাচ্ছে। নোডের মতো ইভেন্ট-চালিত সার্ভারে ফাইল সিস্টেম থ্রেডটি নির্দিষ্ট ইভেন্টের মূল নোড থ্রেডকে যেমন ইভেন্টের সাথে সম্পর্কিত কোনও ডেটা সহ সম্পূর্ণতা, ব্যর্থতা বা অগ্রগতি সম্পর্কে অবহিত করে (যেমন একটি ডাটাবেস ক্যোয়ারীর ফলাফল বা ত্রুটি হিসাবে বার্তা) এবং প্রধান নোড থ্রেড সেই ডেটা দিয়ে কী করবে তা স্থির করে।

আপনি এখানে এ সম্পর্কে আরও পড়তে পারেন: একক থ্রেডযুক্ত নন-ব্লকিং আইও মডেলটি নোড.জেজে কীভাবে কাজ করে


9
তাই মূলত, যখন আমি প্রথম কোড টুকরা চালানো, এটা ভালো কিছু করতে হবে: request query.; 5 seconds later when the request is done; console.log; যখন দ্বিতীয়, executes: request query; console.log; work on the query;
আজিরাহ

1
@ জনগাল্ট স্ক্যুয়ালটি একটি ভিন্ন থ্রেডে চলে। তবে অবশ্যই এটি আপনার ব্যবহৃত স্কেল ড্রাইভারের প্রয়োগের উপর নির্ভর করে। ড্রাইভারটি নতুন থ্রেড তৈরি করবে, মাইএসকিএল-তে সংযুক্ত হবে এবং কোয়েরি চালাবে। একবার হয়ে গেলে, ফলাফলটি ইভেন্টের কাতারে পোস্ট করুন , এবং নোড কলব্যাক করবে।
সালভাতোরালব

4
অ্যাসিঙ্ক উদাহরণের জন্য একই জিনিস আউটপুট করা সম্ভব নয় # 1? উদাহরণস্বরূপ, database.queryএত তাড়াতাড়ি শেষ হয়েছে যে আমরা পৌঁছানোর console.logসাথে সাথে টাস্কটি ইতিমধ্যে সম্পন্ন হয়ে গেছে।
গ্রেটওয়ल्फ

2
@ দ্য ব্রনক্স যদি console.log("Next line");উদাহরণস্বরূপ 2 বেনামে ফাংশনটির ভিতরে থাকে, ঠিক ঠিক পরে console.log("query finished");, তার অর্থ "নেক্সট লাইন" মুদ্রিত হবে ঠিক "কোয়েরি শেষ হয়েছে" এর পরে? সুতরাং, যদি আমার কাছে নেস্টেড ফ্যাশনে সমস্ত কিছু থাকে তবে সবকিছু সিঙ্ক্রোনাস ফ্যাশনে চলবে, সুতরাং নির্দিষ্ট ফাংশনের সিঙ্ক্রোনাস সংস্করণগুলি ব্যবহার করার বিষয়ে আমাকে চিন্তার দরকার পড়বে না। আমি কি আমার বোঝার মধ্যে সঠিক?
আব্দুল

4
সংক্ষিপ্ত উত্তর : হ্যাঁ @ আবদুল, আপনি ঠিক বলেছেন। দীর্ঘ উত্তর : নেস্টিং ফাংশন (কলব্যাকস) হ'ল ক্রমানুসারে কাজগুলি করার উপায়, "একে অপরের পর এক"। তবে এটি প্রযুক্তিগতভাবে "সিঙ্ক্রোনাস" নয়। বেনামে ফাংশনটি এখনও কার্যকর করা হয় "যখন ব্লকিং অপারেশন শেষ হয়" বা অন্য কথায়, "অবিচ্ছিন্নভাবে"। যখন ব্লকিং অপারেশন চলছে তখন নোড.জেএস অন্যান্য ফাংশন সম্পাদন করতে পারে। ফাংশনগুলি অ্যাসিঙ্ক থেকে যায়, এটি কেবল যে আপনি তাদের শৃঙ্খলিত করছেন। সিঙ্ক ফাংশনগুলি কার্যকর করে, এটিই মূল কী।
সালভাতোরালব

74

এই দুটি পদ্ধতির মধ্যে পার্থক্য নিম্নরূপ:

সিঙ্ক্রোনাস উপায়: এটি প্রতিটি অপারেশন সম্পূর্ণ হওয়ার জন্য অপেক্ষা করে, তারপরে এটি কেবল পরবর্তী অপারেশনটি সম্পাদন করে। আপনার ক্যোয়ারির জন্য: console.log()ডাটাবেস থেকে সমস্ত ফলাফল পেতে কোয়েরি চালানো শেষ না হওয়া অবধি কমান্ড কার্যকর করা হবে না।

অ্যাসিনক্রোনাস উপায়: এটি প্রতিটি অপারেশন সম্পূর্ণ হওয়ার জন্য কখনই অপেক্ষা করে না, বরং এটি কেবল প্রথম জিওতে সমস্ত ক্রিয়াকলাপ সম্পাদন করে। ফলাফল পাওয়ার পরে প্রতিটি অপারেশনের ফলাফল পরিচালনা করা হবে। আপনার প্রশ্নের জন্য: console.log()কমান্ডটি Database.Query()পদ্ধতির পরে শীঘ্রই কার্যকর করা হবে । ডেটাবেস ক্যোয়ারী পটভূমিতে চলে এবং ফলাফল পুনরায় লোড করার পরে ফলাফলটি লোড করে।

ব্যবহারের ক্ষেত্রে

  1. যদি আপনার অপারেশনগুলি ডিবি থেকে বিশাল ডেটা জিজ্ঞাসা করার মতো খুব ভারী উত্তোলন না করে তবে সিঙ্ক্রোনাস পদ্ধতিতে অন্যথায় অ্যাসিঙ্ক্রোনাস পথে এগিয়ে যান।

  2. অ্যাসিঙ্ক্রোনাস উপায়ে আপনি ব্যবহারকারীকে কিছু অগ্রগতি সূচক প্রদর্শন করতে পারেন যখন পটভূমিতে আপনি আপনার ভারী ওজন কাজগুলি চালিয়ে যেতে পারেন। এটি জিইউআই অ্যাপ্লিকেশনগুলির জন্য একটি আদর্শ দৃশ্য।


2
তার মানে কি ডিবি.কোয়ারি (সেন্টিমিডি, কলব্যাক) একই সাথে চলছে (থ্রেডগুলিতে)? তারা কি একই সাথে চলছে?
চার্লি পার্কার

তার দ্বিতীয় উদাহরণে, কোয়েরিটি এত দ্রুত শেষ হওয়ার কোনও সুযোগ আছে যে তারপরে কলব্যাকটি প্রথমে কল করে, আগে console.log?
ফাহমি

@ ফাহমি তাত্ত্বিকভাবে হ্যাঁ, কার্যত যথেষ্ট অসম্ভব
লিও মেসি

24

আপনি উভয় উদাহরণে লাইন যুক্ত করলে এটি কিছুটা স্পষ্ট হয়ে উঠবে:

var result = database.query("SELECT * FROM hugetable");
console.log(result.length);
console.log("Hello World");

দ্বিতীয়টি:

database.query("SELECT * FROM hugetable", function(rows) {
   var result = rows;
   console.log(result.length);
});
console.log("Hello World");

এগুলি চালানোর চেষ্টা করুন, এবং আপনি লক্ষ্য করবেন যে প্রথম (সিঙ্ক্রোনাস) উদাহরণস্বরূপ, ফলাফল. দৈর্ঘ্য 'হ্যালো ওয়ার্ল্ড' লাইনের আগে মুদ্রণ করা হবে। দ্বিতীয় (অ্যাসিনক্রোনাস) উদাহরণে, রেজাল্ট দৈর্ঘ্য (সম্ভবত সম্ভবত) "হ্যালো ওয়ার্ল্ড" লাইনের পরে মুদ্রিত হবে।

এটি কারণ দ্বিতীয় উদাহরণে, database.queryপটভূমিতে এটি অবিচ্ছিন্নভাবে চালিত হয় এবং স্ক্রিপ্টটি সরাসরি "হ্যালো ওয়ার্ল্ড" দিয়ে অবিরত থাকে। console.log(result.length)যখন ডাটাবেসের কোয়েরি সম্পন্ন করেছে শুধুমাত্র মৃত্যুদন্ড কার্যকর করা হয়।


1
আপনি বলেছেন: "হ্যালো ওয়ার্ল্ড" লাইনের পরে ফলাফল দৈর্ঘ্য (সম্ভবত) মুদ্রিত হবে। .... কেন এটি কেবল "খুব সম্ভবত" হবে? আমি মনে করি এটি সর্বদা কনসোল.লগ আউটপুট পরে মুদ্রিত হয়। :) শোধন করার জন্য ধন্যবাদ
humanityANDpeace

9
@ হিউম্যানিটিএন্ডপিস: এটি অ্যাসিনক্রোনাস অ্যাক্সেসের সম্পূর্ণ বিষয়: কখন হয় তা আপনি জানেন না । সম্ভবত এটি একটি অযৌক্তিকভাবে দ্রুত ডেটাবেস, এবং জাভাস্ক্রিপ্ট "হ্যালো ওয়ার্ল্ড" লাইনে যাওয়ার আগেই ডাটাবেস ক্যোয়ারী ফিরে আসে ...
মার্টিজান

19

প্রথমত, আমি বুঝতে পারি যে আমি এই প্রশ্নের উত্তর দিতে দেরি করছি।

সিঙ্ক্রোনাস এবং অ্যাসিনক্রোনাস নিয়ে আলোচনা করার আগে আসুন আমরা কীভাবে প্রোগ্রামগুলি চালিত হয় তা সংক্ষেপে দেখি।

ইন সমলয় ক্ষেত্রে, প্রতিটি বিবৃতি সমাপ্ত করার আগে পরবর্তী প্রতিবেদনটি চালানো হয়। এই ক্ষেত্রে প্রোগ্রামটি বিবৃতিগুলির ক্রম অনুসারে মূল্যায়ন করা হয়।

এইভাবে জাভাস্ক্রিপ্টে অ্যাসিঙ্ক্রোনাস কাজ করে। জাভাস্ক্রিপ্ট ইঞ্জিনে দুটি অংশ রয়েছে, একটি অংশ যা কোডটি দেখায় এবং ক্রিয়াকলাপকে সজ্জিত করে এবং অন্যটি সারিটি প্রক্রিয়া করে। সারি প্রক্রিয়াকরণটি একটি থ্রেডে ঘটে, এজন্য একবারে কেবলমাত্র একটি অপারেশন হতে পারে।

যখন একটি অ্যাসিঙ্ক্রোনাস অপারেশন (দ্বিতীয় ডাটাবেস ক্যোয়ারির মতো) দেখা যায়, কোডটি পার্স করা হয় এবং ক্রিয়াকলাপটি কাতারে রাখা হয়, তবে এই অপারেশনটি সম্পূর্ণ হওয়ার পরে একটি কলব্যাক চালানোর জন্য নিবন্ধিত হয়। কাতারে ইতিমধ্যে এটিতে অনেকগুলি অপারেশন থাকতে পারে। কাতারের সামনের অপারেশনটি প্রক্রিয়াজাত করা হয় এবং সারি থেকে সরানো হয়। ডাটাবেস ক্যোয়ারির অপারেশনটি একবার প্রক্রিয়া করা হয়ে গেলে, অনুরোধটি ডাটাবেসে প্রেরণ করা হয় এবং সম্পূর্ণ হয়ে গেলে কলব্যাক কার্যকর করা হবে। এই সময়ে, কাতারি প্রসেসর অপারেশনটি "পরিচালনা" করার পরে পরবর্তী অপারেশনটির দিকে চলে যায় - এই ক্ষেত্রে

    console.log("Hello World"); 

ডাটাবেস ক্যোয়ারী এখনও প্রক্রিয়া করা হচ্ছে, তবে কনসোল.লগ অপারেশনটি সারির সামনের দিকে এবং প্রক্রিয়াজাত হয়ে যায়। এটি একটি সিঙ্ক্রোনাস অপারেশন হ'ল তাত্ক্ষণিকভাবে কার্যকর করা হবে যার ফলে অবিলম্বে "হ্যালো ওয়ার্ল্ড" আউটপুট আসবে। কিছু সময় পরে, ডাটাবেস অপারেশন সম্পূর্ণ হয়, কেবল তখনই ক্যোয়ারির সাথে নিবন্ধিত কলব্যাকটি কল করা হয় এবং প্রক্রিয়াজাত করা হয়, ভেরিয়েবল ফলাফলের মানকে সারিতে সেট করে।

এটি সম্ভব যে একটি অ্যাসিনক্রোনাস অপারেশনের ফলে অন্য একটি অ্যাসিনক্রোনাস অপারেশন হবে, এই দ্বিতীয় অপারেশনটি কাতারে রাখা হবে এবং যখন এটি কাতারের সামনের দিকে আসে তখন এটি প্রক্রিয়াভুক্ত হবে। অ্যাসিঙ্ক্রোনাস অপারেশনের সাথে নিবন্ধিত কলব্যাককে কল করা জাভাস্ক্রিপ্টের রান টাইম কীভাবে অপারেশনটির ফলাফলটি সম্পন্ন হয় তা ফিরিয়ে দেয়।

কোন জাভাস্ক্রিপ্ট অপারেশন অ্যাসিনক্রোনাস হয় তা জানার একটি সহজ পদ্ধতিটি কলব্যাকের প্রয়োজন কিনা তা লক্ষ্য করা যায় - কলব্যাকটি এমন কোড যা প্রথম ক্রিয়াকলাপটি শেষ হলে কার্যকর করা হবে। প্রশ্নের দুটি উদাহরণে আমরা দেখতে পাচ্ছি যে কেবলমাত্র দ্বিতীয় কেসের একটি কলব্যাক রয়েছে, সুতরাং এটি উভয়ের অ্যাসিনক্রোনাস অপারেশন। অ্যাসিঙ্ক্রোনাস অপারেশনের ফলাফলটি পরিচালনা করার বিভিন্ন শৈলীর কারণে এটি সর্বদা হয় না।

আরও জানতে, প্রতিশ্রুতি সম্পর্কে পড়ুন। প্রতিশ্রুতিবদ্ধতা হল আরেকটি উপায় যেখানে অ্যাসিক্রোনাস অপারেশনের ফলাফল পরিচালনা করা যায়। প্রতিশ্রুতি সম্পর্কে সুন্দর জিনিস হ'ল কোডিং স্টাইলটি আরও বেশি সিঙ্ক্রোনাস কোডের মতো বোধ করে।

নোড 'fs' এর মতো অনেক লাইব্রেরি কিছু ক্রিয়াকলাপের জন্য উভয় সিঙ্ক্রোনাস এবং অ্যাসিনক্রোনাস স্টাইল সরবরাহ করে। যে ক্ষেত্রে অপারেশনটি বেশি সময় নেয় না এবং প্রচুর পরিমাণে ব্যবহৃত হয় না - যেমন কোনও কনফিগারেশন ফাইল পড়ার ক্ষেত্রে - সিঙ্ক্রোনাস স্টাইল ক্রিয়াকলাপের ফলে কোডটি পড়া সহজ হয়।


6

সিঙ্ক্রোনাস ক্ষেত্রে, এসকিউএল কোয়েরি সম্পাদন শেষ না হওয়া অবধি কনসোল.লগ আদেশটি কার্যকর করা হয় না।

অ্যাসিক্রোনাস ক্ষেত্রে কনসোল.লগ কমান্ড সরাসরি কার্যকর করা হবে। এরপরে কোয়েরির ফলাফলটি "কলব্যাক" ফাংশন পরে কিছুক্ষণ পরে সংরক্ষণ করা হবে।


1
কিন্তু আসলে কি এক সাথে ডাকা হচ্ছে? আমাকে যে বিষয়টি বিভ্রান্ত করে তা হ'ল অ্যাসিঙ্ক্রোনাস কোডে, আসল কোডটি কি একই সময়ে সমান্তরালভাবে চলছে?
চার্লি পার্কার

এটি প্রসেসর (এটি মাল্টি-কোর?) এবং অপারেটিং সিস্টেমের উপর নির্ভর করে। দেখুন en.wikipedia.org/wiki/Multithreading_(software)#Multithreading
এর সাথে সম্পর্কিত

4

মূল পার্থক্য হ'ল অ্যাসিনক্রোনাস প্রোগ্রামিংয়ের সাথে, আপনি অন্যথায় সম্পাদন বন্ধ করবেন না। 'অনুরোধ' তৈরি হওয়ার সময় আপনি অন্য কোডটি কার্যকর করতে পারেন।


2

ফাংশন দ্বিতীয়টি অ্যাসিক্রোনাস করে।

প্রথমটি প্রোগ্রামটিকে পরবর্তী লাইনের চালুর আগে এটি প্রতিটি লাইনের চালুর সমাপ্তির জন্য অপেক্ষা করতে বাধ্য করে। দ্বিতীয়টি প্রতিটি লাইন একবারে (এবং স্বতন্ত্রভাবে) এক সাথে চলার অনুমতি দেয়।

ভাষা এবং ফ্রেমওয়ার্ক (জেএস, নোড.জেএস) যেগুলি অ্যাসিঙ্ক্রোনাস বা একত্রীকরণের অনুমতি দেয় সেই জিনিসগুলির জন্য রিয়েল টাইম ট্রান্সমিশনের প্রয়োজন (যেমন চ্যাট, স্টক অ্যাপ্লিকেশন) great


0

সিঙ্ক প্রোগ্রামিং

সি, সি #, জাভা ইত্যাদির মতো প্রোগ্রামিং ল্যাঙ্কগুলি সিঙ্ক প্রোগ্রামিং, আপনি যা লিখবেন তা আপনার লেখার ক্রম হিসাবে কার্যকর হবে।

-GET DATA FROM SQL.
//Suppose fetching data take 500 msec

-PERFORM SOME OTHER FUNCTION.
//Performing some function other will take 100 msec, but execution of other 
//task start only when fetching of sql data done (i.e some other function 
//can execute only after first in process job finishes).

-TOTAL TIME OF EXECUTION IS ALWAYS GREATER THAN (500 + 100 + processing time) 
msec

এসিঙ্ক

নোডজেস অ্যাসিঙ্ক বৈশিষ্ট্যটি নিয়ে আসে, এটি প্রকৃতির অ-ব্লক করে মনে করে, ধরুন যে কোনও আই / ও টাস্ক যা সময় নিচ্ছে (আনছে, লেখা, পড়া), নোডেজগুলি অলস রাখবে না এবং টাস্কটি শেষ হওয়ার জন্য অপেক্ষা করবে, এটি ' কাতারে পরবর্তী কাজগুলি সম্পাদন শুরু করব এবং যখনই এই সময়টি গ্রহণের কাজ শেষ হবে এটি কলব্যাক ব্যবহার করে অবহিত করবে। নিম্নলিখিত উদাহরণ সাহায্য করবে:

//Nodejs uses callback pattern to describe functions.
//Please read callback pattern to understand this example

//Suppose following function (I/O involved) took 500 msec
function timeConsumingFunction(params, callback){
  //GET DATA FROM SQL
  getDataFromSql(params, function(error, results){
    if(error){
      callback(error);
    }
    else{
      callback(null, results);
    }
  })
}

//Suppose following function is non-blocking and took 100 msec
function someOtherTask(){
  //some other task
  console.log('Some Task 1');
  console.log('Some Task 2');
}

console.log('Execution Start');

//Start With this function
timeConsumingFunction(params, function(error, results){
    if(error){
      console.log('Error')
    }
    else{
      console.log('Successfull'); 
    }
  })

//As (suppose) timeConsumingFunction took 500 msec, 
//As NodeJs is non-blocking, rather than remain idle for 500 msec, it will start 
//execute following function immediately
someOtherTask();

সংক্ষেপে, আউটপুটটি হ'ল:

Execution Start
//Roughly after 105 msec (5 msec it'll take in processing)
Some Task 1
Some Task 2
//Roughly After 510 msec
Error/Successful //depends on success and failure of DB function execution

পার্থক্য স্পষ্ট যেখানে সিঙ্কটি অবশ্যই 600 (500 + 100 + প্রসেসিং সময়) এমসেকে বেশি সময় নেবে, অ্যাসিঙ্ক সময় সাশ্রয় করে।


0

সিঙ্ক্রোনাস ফাংশনগুলি ব্লক করছে যখন অ্যাসিক্রোনাস ফাংশনগুলি নেই। সিঙ্ক্রোনাস ফাংশনে, পরবর্তী বিবৃতিটি চালানোর আগে বিবৃতি সম্পূর্ণ হয়। এই ক্ষেত্রে, প্রোগ্রামটির বিবৃতিগুলির যথাযথভাবে মূল্যায়ন করা হয় এবং যদি বিবৃতিগুলির মধ্যে একটি খুব দীর্ঘ সময় নেয় তবে প্রোগ্রামটির কার্য সম্পাদন বিরতি দেওয়া হয়।

অ্যাসিঙ্ক্রোনাস ফাংশন সাধারণত প্যারামিটার হিসাবে কলব্যাক গ্রহণ করে এবং অ্যাসিঙ্ক্রোনাস ফাংশনটি শুরু হওয়ার সাথে সাথে পরের লাইনে এক্সিকিউশন চালিয়ে যায়। অ্যাসিক্রোনাস অপারেশন সম্পূর্ণ হয়ে গেলে এবং কল স্ট্যাকটি খালি থাকলেই কলব্যাকটি ডাকা হয়। একটি ওয়েব সার্ভার থেকে ডেটা লোড করা বা একটি ডাটাবেস অনুসন্ধানের মতো ভারী শুল্ক ক্রিয়াকলাপগুলি অবিচ্ছিন্নভাবে করা উচিত যাতে মূল থ্রেডটি দীর্ঘ অপারেশনটি শেষ না হওয়া অবধি ব্লক করার পরিবর্তে অন্যান্য ক্রিয়াকলাপ চালিয়ে যেতে পারে (ব্রাউজারগুলির ক্ষেত্রে, ইউআই স্থির হয়ে যাবে) ।

অরগিনাল গিথুব পোস্ট করেছেন: লিঙ্ক


0

জেএসে অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং:

সমলয়

  • এটি না হওয়া পর্যন্ত পরবর্তী কোড কার্যকর করা বন্ধ করে দেয়।
  • কারণ এটি আরও কার্যকর করার এই স্টপেজ, সিঙ্ক্রোনাস কোডটিকে 'ব্লকিং' বলে। এই অর্থে ব্লক করা হচ্ছে যে অন্য কোনও কোড কার্যকর করা হবে না।

অসমনিয়ত

  • এটির কার্য সম্পাদন ইভেন্ট লুপকে পিছিয়ে দেওয়া হয়, এটি একটি জেএস ভার্চুয়াল মেশিনে একটি কনস্ট্রাক্ট যা অ্যাসিনক্রোনাস ফাংশনগুলি সম্পাদন করে (সিঙ্ক্রোনাস ফাংশনগুলির স্ট্যাক ফাঁকা থাকার পরে)।
  • অ্যাসিঙ্ক্রোনাস কোডটিকে নন ব্লকিং বলা হয় কারণ এটি আরও কোডটি চলমান থেকে অবরুদ্ধ করে না।

উদাহরণ:

// This function is synchronous
function log(arg) {
    console.log(arg)
}

log(1);

// This function is asynchronous
setTimeout(() => {
    console.log(2)
}, 0);

log(3)

  • উদাহরণ লগ 1, 3, 2।
  • 2 সর্বশেষ লগইন হয়েছে কারণ এটি একটি অ্যাসিক্রোনাস ফাংশনের অভ্যন্তরে রয়েছে যা স্ট্যাক খালি হওয়ার পরে কার্যকর করা হয়।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.