নোড.জেএসে সেটটাইমআউট কীভাবে কাজ করে?


112

আমি অনুমান করি যে একবার এটি কার্যকর হওয়ার পরে এটি কাতারে রয়েছে, তবে কিউটিতে কোনও মিল রয়েছে যে এটি এক্স মিলিসেকেন্ডের ঠিক পরে ডাকবে? অথবা কাতারে থাকা আরও ভারী কাজগুলি কি এটিকে বিলম্ব করবে?


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

উত্তর:


174

সেটটাইমআউটটির শব্দার্থকতা একটি ওয়েব ব্রাউজারের মতো প্রায় একই রকম: টাইমআউট আর্গ কার্যকর করার আগে অপেক্ষা করার জন্য ন্যূনতম সংখ্যা এমএস, গ্যারান্টি নয়। তদুপরি, 0, একটি অ-সংখ্যা, বা negativeণাত্মক সংখ্যাটি পাস করার ফলে এটি ন্যূনতম সংখ্যক এমএস অপেক্ষা করতে পারে। নোডে, এটি 1 মিমি, তবে ব্রাউজারগুলিতে এটি 50 মিমি পর্যন্ত হতে পারে।

এর কারণটি হ'ল জাভাস্ক্রিপ্ট দ্বারা জাভাস্ক্রিপ্টের কোনও পূর্বরূপ নেই। এই উদাহরণ বিবেচনা করুন:

setTimeout(function () {
  console.log('boo')
}, 100)
var end = Date.now() + 5000
while (Date.now() < end) ;
console.log('imma let you finish but blocking the event loop is the best bug of all TIME')

এখানে প্রবাহটি হ'ল:

  1. 100ms জন্য সময়সীমা নির্ধারণ করুন।
  2. 5000 মিটারের জন্য ব্যস্তওয়েট।
  3. ইভেন্ট লুপ ফিরে। মুলতুবি টাইমারগুলির জন্য পরীক্ষা করুন এবং সম্পাদন করুন।

যদি এটি না হয়, তবে আপনার কাছে জাভাস্ক্রিপ্টের একটি বিট অন্য "বিঘ্নিত" হতে পারে। এ জাতীয় কোডটিকে যুক্তিযুক্ত হওয়াতে অত্যন্ত কঠিন হওয়া থেকে রোধ করার জন্য আমাদেরকে মিউটেক্সেস এবং সেমফোরস এবং এই জাতীয় সেট আপ করতে হবে:

var a = 100;
setTimeout(function () {
  a = 0;
}, 0);
var b = a; // 100 or 0?

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

এটি কি প্রিমিপশন জটিলতার চেয়ে যুদ্ধের চেয়ে উত্তম রাক্ষস? সেটা নির্ভর করে.


20
ব্যতিক্রমী সঠিক console.logবার্তাটির জন্য আপনি একটি +1 পান ।
ফান্ড মনিকার লসুইট

আমি পছন্দ করি আপনি কীভাবে আপনার স্ট্রিংয়ে TIME আর্পস করেছেন। খুব ভাল ব্যাখ্যা !!!
অ্যালিসন

43

অ-অবরুদ্ধকরণের ধারণাটি হ'ল লুপের পুনরাবৃত্তিগুলি দ্রুত হয়। সুতরাং প্রতিটি টিকের পুনরাবৃত্তি করতে সংক্ষিপ্ত পরিমাণে সময় নিতে হবে যে সেটটাইমআউটটি যথাযথ নির্ভুলতার মধ্যে যথাযথ হবে (সম্ভবত <100 এমএস বা এর দ্বারা বন্ধ)।

তাত্ত্বিক যদিও আপনি ঠিক বলেছেন। আমি যদি কোনও অ্যাপ্লিকেশন লিখি এবং টিকটি ব্লক করি, তবে সেটটাইমআউটগুলি বিলম্বিত হবে। সুতরাং আপনার প্রশ্নের উত্তর দেওয়ার জন্য, কে সময়মতো সেটটাইমআউটগুলি সম্পাদন করতে পারে? আপনি, অ-ব্লকিং কোড লিখে, প্রায় কোনও যুক্তিযুক্ত নির্ভুলতার অবধি নির্ভুলতার ডিগ্রিটি নিয়ন্ত্রণ করতে পারেন।

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

আপনার ব্রাউজারে বা নোডে এই কোডটি চেষ্টা করে দেখুন এবং আপনি দেখতে পাবেন যে নির্ভুলতার কোনও গ্যারান্টি নেই, বিপরীতে, সেটটাইমআউটটি খুব দেরিতে হবে:

var start = Date.now();

// expecting something close to 500
setTimeout(function(){ console.log(Date.now() - start); }, 500);

// fiddle with the number of iterations depending on how quick your machine is
for(var i=0; i<5000000; ++i){}

দোভাষী যদি লুপকে অপ্টিমাইটি না করে (যা এটি ক্রোমে থাকে না), আপনি কয়েক হাজারে কিছু পাবেন। লুপটি সরিয়ে ফেলুন এবং আপনি এটি নাকের 500 টি দেখতে পাবেন ...


9

কোডটি কার্যকর করা হয়েছে তা নিশ্চিত করার একমাত্র উপায় হ'ল আপনার সেটটাইমআউট লজিককে অন্য কোনও প্রক্রিয়াতে স্থাপন করা।

একটি নতুন নোড.জেএস প্রোগ্রাম স্পেন করতে শিশু প্রক্রিয়া মডিউলটি ব্যবহার করুন যা আপনার যুক্তিটি করে এবং কোনও প্রবাহের (সম্ভবত টিসিপি) মাধ্যমে সেই প্রক্রিয়াটিতে ডেটা প্রেরণ করে।

আপনার প্রধান প্রক্রিয়াতে কিছু দীর্ঘ ব্লকিং কোড চলমান থাকলেও আপনার শিশু প্রক্রিয়াটি ইতিমধ্যে নিজেই শুরু হয়ে গেছে এবং একটি নতুন প্রক্রিয়া এবং একটি নতুন থ্রেডে একটি সেটটাইমআউট স্থাপন করেছে এবং যখন আপনি এটি প্রত্যাশা করেন তখন চলবে।

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

সাধারণভাবে শিশু প্রসেসগুলি ব্যবহার করা এবং একাধিক নোড অ্যাপ্লিকেশনগুলি পৃথক প্রক্রিয়া হিসাবে লোড ব্যালেন্সার বা ভাগ করা ডেটা স্টোরেজ (রেডিসের মতো) সাথে আপনার কোডটি স্কেল করার জন্য গুরুত্বপূর্ণ।


9

setTimeoutএটি এক ধরণের থ্রেড , এটি একটি নির্দিষ্ট সময় এবং কার্যকর করার জন্য একটি অপারেশন ধারণ করে।

setTimeout(function,time_in_mills);

এখানে প্রথম যুক্তিটি একটি ফাংশনের ধরণের হওয়া উচিত; উদাহরণস্বরূপ যদি আপনি 3 সেকেন্ড পরে নিজের নাম মুদ্রণ করতে চান তবে আপনার কোডটি নীচের মতো কিছু হওয়া উচিত।

setTimeout(function(){console.log('your name')},3000);

মনে রাখার মূল বিষয় হ'ল আপনি যে setTimeoutপদ্ধতিটি ব্যবহার করে যা করতে চান তা কোনও ফাংশনের অভ্যন্তরেই করুন । আপনি যদি কিছু প্যারামিটারগুলি বিশ্লেষণ করে অন্য কোনও পদ্ধতিতে কল করতে চান তবে আপনার কোডটি নীচের মত দেখতে হবে:

setTimeout(function(){yourOtherMethod(parameter);},3000);

8

setTimeout(callback,t)কমপক্ষে টি মিলিসেকেন্ডের পরে কলব্যাক চালাতে ব্যবহৃত হয় । আসল বিলম্ব ওএস টাইমার গ্রানুলারিটি এবং সিস্টেম লোডের মতো অনেক বাহ্যিক কারণের উপর নির্ভর করে।

সুতরাং, সম্ভাবনা রয়েছে যে এটি নির্ধারিত সময়ের পরে কিছুটা ডাকা হবে, তবে এর আগে কখনও ডাকা হবে না।

একটি টাইমার 24.8 দিনের বেশি সময়কাল ধরে রাখতে পারে না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.