ইভেন্ট লুপ প্রসঙ্গে মাইক্রোটাস্ক এবং ম্যাক্রোটাস্কের মধ্যে পার্থক্য


140

আমি সবেমাত্র প্রতিশ্রুতি / এ + স্পেসিফিকেশন পড়া শেষ করেছি এবং মাইক্রোটাস্ক এবং ম্যাক্রোটাস্ক পদগুলিতে হোঁচট খেয়েছি: দেখুন http://promisesaplus.com/#notes

আমি এই শর্তাবলী আগে কখনও শুনিনি, এবং এখন আমি উত্সাহী কি পার্থক্য হতে পারে?

আমি ওয়েবে ইতিমধ্যে কিছু তথ্য সন্ধান করার চেষ্টা করেছি, তবে আমি যা পেয়েছি তা ডব্লিউ 3.org আর্কাইভসের পোস্ট (যা আমার কাছে তফাতটির ব্যাখ্যা দেয় না): http://lists.w3.org/ আর্কাইভস /Public/public-nextweb/2013Jul/0018.html

অতিরিক্ত হিসাবে, আমি "ম্যাক্রোটাস্ক" নামে একটি এনপিএম মডিউল পেয়েছি: https://www.npmjs.org/package/macrotask আবার, পার্থক্যটি ঠিক কী তা পরিষ্কার করা হয়নি।

আমি যা জানি তা হ'ল, এটির সাথে https://html.spec.whatwg.org/multipage/webappapis.html#task-queue এবং https: //html.spec.hatwg এ বর্ণিত ইভেন্ট লুপটির সাথে কিছুটা রয়েছে .org / multipage / webappapis.html # সঞ্চালন-এ-microtask-চেকপয়েন্ট

আমি জানি আমার এই তাত্ত্বিকভাবে এই WHATWG স্পেসিফিকেশন প্রদত্ত পার্থক্যগুলি নিজেই বের করতে সক্ষম হওয়া উচিত। তবে আমি নিশ্চিত যে একজন বিশেষজ্ঞের দেওয়া সংক্ষিপ্ত ব্যাখ্যা থেকে অন্যরাও উপকৃত হতে পারে।


সংক্ষেপে: একাধিক নেস্টেড ইভেন্টের সারি। এমনকি আপনি নিজে এটি প্রয়োগ করতে পারেন:while (task = todo.shift()) task();
বার্গি

1
যে কারও কাছে আরও কিছু বিশদ জানতে চান: জাভাস্ক্রিপ্ট নিনজার গোপনীয়তা, দ্বিতীয় সংস্করণ, অধ্যায় 13 বেঁচে থাকার ইভেন্টগুলি
এথন

উত্তর:


220

এক বারেই-অ্যারাউন্ড ঘটনা লুপের থাকবে ঠিক একটি টাস্ক থেকে প্রক্রিয়া করা হচ্ছে macrotask কিউ (এই কিউ কেবল বলা হয় কাজের কিউ মধ্যে WHATWG স্পেসিফিকেশন )। এই ম্যাক্রোটাস্কটি শেষ হওয়ার পরে, সমস্ত উপলভ্য মাইক্রোটাস্কগুলি প্রক্রিয়া করা হবে, যথা একই গো-চারপাশের চক্রের মধ্যে। এই মাইক্রোটাস্কগুলি প্রক্রিয়া করার সময়, তারা আরও বেশি মাইক্রোটাস্ক সারি করতে পারে, যা মাইক্রোটাস্ক সারি শেষ না হওয়া অবধি সমস্ত এক এক করে চালানো হবে।

এর ব্যবহারিক পরিণতি কী?

যদি মাইক্রোটাস্ক পুনরাবৃত্তভাবে অন্যান্য মাইক্রোটাস্কে সারিতে থাকে, পরবর্তী ম্যাক্রোটাস্কটি প্রক্রিয়া না করা পর্যন্ত এটি অনেক সময় নিতে পারে। এর অর্থ, আপনি অবরুদ্ধ UI দিয়ে শেষ করতে পারেন, বা আপনার অ্যাপ্লিকেশনটিতে আই / ও কেটে গেছে।

তবে কমপক্ষে নোড.জেএস এর প্রসেস.নেক্সটটিক ফাংশন (যা মাইক্রোটাস্কের সারি রয়েছে ) সম্পর্কিত, প্রসেস.ম্যাক্সটিকডেপথের মাধ্যমে এই জাতীয় ব্লকিংয়ের বিরুদ্ধে একটি অন্তর্নির্মিত সুরক্ষা রয়েছে। এই সীমাটি 1000 এর ডিফল্টতে সেট করা আছে, এই সীমাটি পৌঁছে যাওয়ার পরে মাইক্রোটাস্কের আরও প্রক্রিয়াজাতকরণ কেটে ফেলা হয় যা পরবর্তী ম্যাক্রোটাস্ককে প্রক্রিয়া করার অনুমতি দেয় )

তাহলে কখন কী ব্যবহার করবেন?

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

উদাহরণ

macrotasks: setTimeout , setInterval , setImmediate , requestAnimationFrame , ইনপুট / আউটপুট , UI 'তে রেন্ডারিং
microtasks: process.nextTick , অঙ্গীকার , queueMicrotask , MutationObserver


4
ইভেন্ট লুপটিতে একটি মাইক্রোটাস্ক চেকপয়েন্ট রয়েছে যদিও, বেশিরভাগ বিকাশকারী মাইক্রোটাস্কের মুখোমুখি হবেন না। জেএস স্ট্যাকটি খালি হয়ে গেলে মাইক্রোটাস্কগুলি প্রক্রিয়া করা হয়। এটি কোনও টাস্কের মধ্যে বা ইভেন্ট লুপের রেন্ডার পদক্ষেপগুলির মধ্যেও অনেক সময় ঘটতে পারে।
জাফাএকেক

2
process.maxTickDepthখুব দীর্ঘ সময় আগে সরানো হয়েছিল: github.com/nodejs/node/blob/…
রিজএ

আপনি একটি নতুন মাইক্রোটাস্ক যুক্ত করতে
কাতার

ধন্যবাদ @ জুমআল, এখন অবধি কিউ মাইক্রোটাস্ক () জানতেন না। আমি এটিকে উত্তরগুলিতে এবং সমস্ত
সামগ্রীর

অনুরোধঅ্যানিমেশনফ্রেম (আরএএফ) কেবল মাইক্রোটাস্ক তৈরি করে না। সাধারণত আরএএফ কল বলতে আলাদা
জুমআল

67

বেসিক ধারণা বৈশিষ্ট :

  • ইভেন্টের লুপটিতে এক বা একাধিক টাস্কের সারি রয়েছে task (টাস্ক সারিটি ম্যাক্রোটাস্ক সারি)
  • প্রতিটি ইভেন্টের লুপটিতে একটি মাইক্রোটাস্কের সারি থাকে।
  • টাস্ক কিউ = ম্যাক্রোটাস্ক কিউ! = মাইক্রোটাস্ক কাতার
  • কোনও কাজ ম্যাক্রোটাস্ক কাতারে বা মাইক্রোটাস্ক সারিতে ঠেলাতে পারে
  • যখন কোনও কাজকে একটি কাতারে ধাক্কা দেওয়া হয় (মাইক্রো / ম্যাক্রো), আমরা বোঝাই যে প্রস্তুতি কাজ শেষ হয়েছে, সুতরাং এখন টাস্কটি কার্যকর করা যেতে পারে।

এবং ইভেন্ট লুপ প্রক্রিয়া মডেলটি নিম্নরূপ:

যখন কল স্ট্যাক খালি, steps- না

  1. টাস্ক কাতারে প্রাচীনতম টাস্ক (টাস্ক এ) নির্বাচন করুন
  2. যদি টাস্ক এ নাল হয় (মানে টাস্কের সারি খালি রয়েছে), step ধাপে লাফ দিন
  3. "বর্তমানে চলমান টাস্ক" কে "টাস্ক এ" তে সেট করুন
  4. "টাস্ক এ" চালান (মানে কলব্যাক ফাংশনটি চালান)
  5. বাতিল করতে "বর্তমানে চলমান টাস্ক" সেট করুন, "টাস্ক এ" সরান
  6. মাইক্রোটাস্ক সারি সঞ্চালন
    • (ক) .মাইক্রোটাস্ক সারিতে সবচেয়ে পুরানো কাজ (টাস্ক এক্স) নির্বাচন করুন
    • (খ) .আইএফ টাস্ক x নাল হয় (মানে মাইক্রোটাস্কের সারিগুলি ফাঁকা), পদক্ষেপে লাফিয়ে উঠুন (ছ)
    • (গ) .সেট "বর্তমানে চলমান টাস্ক" থেকে "টাস্ক এক্স"
    • (d) .রুন "টাস্ক এক্স"
    • (ঙ)। "বর্তমানে চলমান টাস্ক" টি বাতিল করতে, "টাস্ক এক্স" সরান
    • (চ) .মাইক্রোটাস্ক সারিতে পরবর্তী সবচেয়ে পুরানো কাজটি নির্বাচন করুন, পদক্ষেপে লাফ দিন (খ)
    • (ছ) .ফ্রিনিশ মাইক্রোটাস্ক সারিতে;
  7. পদক্ষেপ 1 এ লাফ দিন।

সরলীকৃত প্রক্রিয়া মডেলটি নিম্নরূপ:

  1. ম্যাক্রোটাস্ক কাতারে প্রাচীনতম কাজটি চালান, তারপরে এটি সরিয়ে দিন।
  2. মাইক্রোটাস্ক কাতারে সমস্ত উপলব্ধ কাজগুলি চালান, তারপরে সেগুলি সরিয়ে দিন।
  3. পরবর্তী রাউন্ড: ম্যাক্রোটাস্ক কাতারে পরবর্তী কাজ চালান (পদক্ষেপ 2 পদক্ষেপ)

মনে রাখার মতন কিছু:

  1. যখন কোনও টাস্ক (ম্যাক্রোটাস্ক কাতারে) চলছে, তখন নতুন ইভেন্টগুলি নিবন্ধিত হতে পারে o তাই নতুন কোনও কাজ তৈরি করা যেতে পারে el নীচে দুটি নতুন তৈরি করা কাজ রয়েছে:
    • वचनআ.থেন () এর কলব্যাক একটি কাজ
      • প্রতিশ্রুতিটি সমাধান করা / প্রত্যাখ্যান করা হয়েছে: ইভেন্ট লুপের বর্তমান রাউন্ডে টাস্কটি মাইক্রোটাস্ক কাতারে ঠেলে দেওয়া হবে।
      • প্রতিশ্রুতি মুলতুবি রয়েছে: ভবিষ্যতের ইভেন্ট লুপের পরবর্তী কাজটি মাইক্রোটাস্কের কাতারে ঠেলে দেওয়া হবে (পরের দফায় হতে পারে)
    • সেটটাইমআউট (কলব্যাক, এন) এর কলব্যাক একটি কাজ, এবং ম্যাক্রোটাস্ক সারিতে ফেলে দেওয়া হবে, এমনকি এন 0 হয়;
  2. মাইক্রোটাস্ক সারিতে টাস্কটি বর্তমান রাউন্ডে সঞ্চালিত হবে, যখন ম্যাক্রোটাস্ক সারিতে টাস্কটি ইভেন্ট লুপের পরবর্তী রাউন্ডের জন্য অপেক্ষা করতে হবে।
  3. আমরা সবাই "ক্লিক", "স্ক্রোল", "এজ্যাক্স", "সেটটাইমআউট" ... এর কলব্যাক জানি, তবে আমাদের জেএস কোডগুলিও স্মরণ করা উচিত যে পুরো স্ক্রিপ্ট ট্যাগটিও একটি টাস্ক (ম্যাক্রোটাস্ক) is

2
এটি দুর্দান্ত ব্যাখ্যা! ভাগ করে নেওয়ার জন্য ধন্যবাদ!. আর একটি বিষয় উল্লেখ করার জন্য হ'ল নোডজেস , setImmediate()এটি ম্যাক্রো / টাস্ক এবং process.nextTick()একটি মাইক্রো / কাজ।
লেওন - হান লি

6
ব্রাউজার paintটাস্ক সম্পর্কে কী ? তারা কোন বিভাগে মাপসই করা হবে?
কিংবদন্তি

আমি মনে করি তারা মাইক্রো টাস্কগুলিতে ফিট করবে (যেমন requestAnimationFrame)
দিব্যংশু মাইথানি

এখানে v8 ইভেন্ট লুপটি যে ক্রমটি চালায় -> কল স্ট্যাক || মাইক্রো টাস্ক || কার্য সারি || আরএএফ || রেন্ডার ট্রি || লেআউট || পেইন্ট || <ওএস নেটিভ একটি স্ক্রিনে পিক্সেলগুলি আঁকতে কল করে> <----- 1) ডোম (নতুন পরিবর্তন), সিএসএসএম (নতুন পরিবর্তন), রেন্ডার ট্রি, লেআউট এবং পেইন্টটি অনুরোধের পরে ঘটবে অ্যানিমেশন ফ্রেম কলব্যাক ইভেন্ট-লুপ টাইমার অনুসারে। এ কারণেই আরএএএফ-এর আগে আপনার ডোম ক্রিয়াকলাপ সমাপ্ত করা গুরুত্বপূর্ণ, আপনি যতটা পারেন, বিশ্রামে নেওয়া যেতে পারে। PS: কলিং আরএএফ একটি ম্যাক্রো-টাস্ক এক্সিকিউশনকে ট্রিগার করবে।
আনভেশ চেকা

আমি জানি না আমার ভুল হয়েছে কিনা তবে আমি এই উত্তরটির সাথে একমত নই, মাইক্রোটাস্ক ম্যাক্রোটাস্কের আগে চলে runs codepen.io/walox/pen/yLYjNRq ?
ওয়ালক্স

9

আমি মনে করি আমরা স্ট্যাক থেকে পৃথক করে ইভেন্ট লুপটি নিয়ে আলোচনা করতে পারি না, সুতরাং:

জেএসের তিনটি "স্ট্যাক" রয়েছে:

  • সমস্ত সিঙ্ক্রোনাস কলগুলির জন্য স্ট্যান্ডার্ড স্ট্যাক (এক ফাংশন অন্যটিকে কল করে, ইত্যাদি)
  • উচ্চ অগ্রাধিকার (প্রসেস.নেক্সটটিক, প্রতিশ্রুতি, অবজেক্ট.অবজার, মিউটেশনঅবার্সার) সহ সমস্ত অ্যাসিঙ্ক ক্রিয়াকলাপের জন্য মাইক্রোটাস্ক সারি (বা কাজের সারি বা মাইক্রোটাস্ক স্ট্যাক )
  • নিম্ন অগ্রাধিকার (সেটটাইমআউট, সেটইন্টারভাল, সেটইমিডিয়েট, অনুরোধএনিমেশন ফ্রেম, আই / ও, ইউআই রেন্ডারিং) সহ সমস্ত অ্যাসিঙ্ক ক্রিয়াকলাপের জন্য ম্যাক্রোটাস্ক সারি (বা ইভেন্টের সারি, টাস্ক সারি, ম্যাক্রোটাস্ক সারি )
|=======|
| macro |
| [...] |
|       |
|=======|
| micro |
| [...] |
|       |
|=======|
| stack |
| [...] |
|       |
|=======|

এবং ইভেন্ট লুপটি এইভাবে কাজ করে:

  • স্ট্যাক থেকে নীচে থেকে উপরে সবকিছু সম্পাদন করুন এবং কেবল যখন স্ট্যাকটি খালি থাকে, উপরের সারিতে কী চলছে তা পরীক্ষা করে দেখুন
  • মাইক্রো স্ট্যাকটি পরীক্ষা করুন এবং স্ট্যাকের সাহায্যে সমস্ত কিছু (যদি প্রয়োজন হয়) সম্পাদন করুন, মাইক্রোটাস্ক সারি খালি না হওয়া পর্যন্ত একের পর এক মাইক্রো টাস্ক বা কোনও এক্সিকিউশন প্রয়োজন হয় না এবং কেবল ম্যাক্রো স্ট্যাক পরীক্ষা করুন
  • ম্যাক্রো স্ট্যাকটি পরীক্ষা করুন এবং স্ট্যাকের সাহায্যে সেখানে সমস্ত কিছু (যদি প্রয়োজন হয়) সম্পাদন করুন

স্ট্যাক খালি না হলে মাইোক স্ট্যাক টাচ হবে না। মাইক্রো স্ট্যাকটি ফাঁকা না থাকলে বা কোনও প্রয়োগের প্রয়োজন না হলে ম্যাক্রো স্ট্যাকটি স্পর্শ করবে না।

সংক্ষিপ্তসার হিসাবে: মাইক্রোটাস্ক সারি ম্যাক্রোটাস্ক সারি হিসাবে প্রায় একই তবে সেই কাজগুলি (প্রক্রিয়া.নেক্সটটিক, প্রতিশ্রুতিগুলি, অবজেক্ট.ওব্রিজ, মিউটেশনঅবার্সার) ম্যাক্রোটাস্কের চেয়ে বেশি অগ্রাধিকার রয়েছে।

মাইক্রো ম্যাক্রোর মতো তবে উচ্চ অগ্রাধিকার সহ।

এখানে সমস্ত কিছু বোঝার জন্য আপনার কাছে "চূড়ান্ত" কোড রয়েছে।

console.log('stack [1]');
setTimeout(() => console.log("macro [2]"), 0);
setTimeout(() => console.log("macro [3]"), 1);

const p = Promise.resolve();
for(let i = 0; i < 3; i++) p.then(() => {
    setTimeout(() => {
        console.log('stack [4]')
        setTimeout(() => console.log("macro [5]"), 0);
        p.then(() => console.log('micro [6]'));
    }, 0);
    console.log("stack [7]");
});

console.log("macro [8]");

/* Result:
stack [1]
macro [8]

stack [7], stack [7], stack [7]

macro [2]
macro [3]

stack [4]
micro [6]
stack [4]
micro [6]
stack [4]
micro [6]

macro [5], macro [5], macro [5]
--------------------
but in node in versions < 11 (older versions) you will get something different


stack [1]
macro [8]

stack [7], stack [7], stack [7]

macro [2]
macro [3]

stack [4], stack [4], stack [4]
micro [6], micro [6], micro [6]

macro [5], macro [5], macro [5]

more info: https://blog.insiderattack.net/new-changes-to-timers-and-microtasks-from-node-v11-0-0-and-above-68d112743eb3
*/

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