জাভাস্ক্রিপ্টটি কি একক থ্রেড হওয়ার নিশ্চয়তা রয়েছে?


610

সমস্ত আধুনিক ব্রাউজার বাস্তবায়নে জাভাস্ক্রিপ্ট একক থ্রেডড হিসাবে পরিচিত, তবে এটি কোনও মানটিতে নির্দিষ্ট বা এটি কেবল traditionতিহ্য দ্বারা? জাভাস্ক্রিপ্ট সর্বদা একক থ্রেডযুক্ত ধরে নেওয়া কি সম্পূর্ণ নিরাপদ?


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

11
এটি অবশ্যই পড়তে হবে: developer.mozilla.org/en/docs/Web/JavaScript/EventLoop
রিকিয়া

উত্তর:


583

এটা একটা ভালো প্রশ্ন. আমি "হ্যাঁ" বলতে পছন্দ করি। পারছি না।

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

(*: ব্রাউজারগুলি সত্যই কোনও ওএস-থ্রেড ব্যবহার করে তাদের জেএস ইঞ্জিনগুলি বাস্তবায়িত করে, বা অন্যান্য সীমাবদ্ধ থ্রেড-অফ-এক্সিকিউশন ওয়েব ওয়ার্কার্স দ্বারা প্রবর্তিত হয়েছে কিনা এই প্রশ্নটিকে উপেক্ষা করে)

যাইহোক, বাস্তবে এটি একেবারেই সত্য নয় , চতুষ্পদ কদর্য উপায়ে।

সর্বাধিক সাধারণ ঘটনা হ'ল তাত্ক্ষণিক ঘটনা। ব্রাউজারগুলি এগুলি তত্ক্ষণাত্ জ্বালিয়ে দেবে যখন আপনার কোড তাদের কারণ হিসাবে কিছু করে:

var l= document.getElementById('log');
var i= document.getElementById('inp');
i.onblur= function() {
    l.value+= 'blur\n';
};
setTimeout(function() {
    l.value+= 'log in\n';
    l.focus();
    l.value+= 'log out\n';
}, 100);
i.focus();
<textarea id="log" rows="20" cols="40"></textarea>
<input id="inp">

log in, blur, log outআইই ব্যতীত সকলের ফলাফল । আপনি focus()সরাসরি ডেকেছিলেন বলে এই ইভেন্টগুলি কেবল আগুন দেয় না , আপনি কল করেছিলেন alert()বা পপ-আপ উইন্ডোটি খোলা বা ফোকাসকে সরিয়ে দেয় এমন অন্য কোনও কারণেই এগুলি ঘটতে পারে ।

এটি অন্যান্য ইভেন্টগুলিরও ফলস্বরূপ হতে পারে। উদাহরণস্বরূপ একজন i.onchangeশ্রোতা যুক্ত করুন এবং focus()কলটি ফোকাস করার আগে ইনপুটটিতে কিছু টাইপ করুন এবং লগ অর্ডারটি log in, change, blur, log outকেবল অপেরা ছাড়া যেখানে এটি log in, blur, log out, changeএবং আইই যেখানে রয়েছে (এমনকি আরও কম স্পষ্টভাবেও নয়) log in, change, log out, blur

একইভাবে click()এমন কোনও উপাদানকে কল করা যা এটি সরবরাহ করে তা onclickসমস্ত ব্রাউজারে তাত্ক্ষণিকভাবে হ্যান্ডলারকে কল করে (কমপক্ষে এটি সামঞ্জস্যপূর্ণ!)।

(আমি সরাসরি ব্যবহার করছি on...এখানে ইভেন্ট হ্যান্ডলার বৈশিষ্ট্য, কিন্তু একই সঙ্গে ঘটে addEventListenerএবং attachEvent।)

আপনার কোডটি থ্রেড করা অবস্থায় ইভেন্টগুলি আগুন দিতে পারে এমন পরিস্থিতিতেও রয়েছে, যদিও আপনি এটিকে উস্কে দেওয়ার জন্য কিছুই করেননি done একটি উদাহরণ:

var l= document.getElementById('log');
document.getElementById('act').onclick= function() {
    l.value+= 'alert in\n';
    alert('alert!');
    l.value+= 'alert out\n';
};
window.onresize= function() {
    l.value+= 'resize\n';
};
<textarea id="log" rows="20" cols="40"></textarea>
<button id="act">alert</button>

হিট করুন alertএবং আপনি একটি মডেল সংলাপ বাক্স পাবেন। আপনি সেই কথোপকথনটি খারিজ না করা পর্যন্ত আর কোনও স্ক্রিপ্ট কার্যকর হবে না, হ্যাঁ? নাঃ। মূল উইন্ডোটি পুনরায় আকার দিন এবং আপনি alert in, resize, alert outটেক্সারিয়ায় পাবেন।

আপনি যদি ভাবেন যে কোনও উইন্ডোটির আকার পরিবর্তন করা অসম্ভব তবে একটি মডেল সংলাপ বাক্স রয়েছে তবে এটি নয়: লিনাক্সে, আপনি উইন্ডোটি যতটা পছন্দ পরিবর্তন করতে পারেন; উইন্ডোজে এটি এত সহজ নয়, তবে আপনি স্ক্রিনের রেজোলিউশনটি বৃহত্তর থেকে ছোট্ট যেখানে উইন্ডোটি ফিট করে না সেখানে পরিবর্তন করে এটির আকার পরিবর্তন করতে পারে।

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

স্ক্রিপ্ট এখনও থ্রেড করা হয় এমন জায়গাগুলি যেখানে আপনার উত্পন্ন হওয়ার কারণ হতে পারে সেগুলি উত্থাপিত হতে পারে:

  • যখন মোডাল পপআপ ( alert, confirm, prompt), খোলা সমস্ত ব্রাউজার কিন্তু অপেরা মধ্যে রয়েছে;

  • showModalDialogএটি সমর্থনকারী ব্রাউজারগুলির সময় ;

  • "এই পৃষ্ঠায় একটি স্ক্রিপ্ট ব্যস্ত থাকতে পারে ..." কথোপকথন বাক্স, এমনকি আপনি যদি স্ক্রিপ্টটি চালিয়ে যেতে চান, পুনরায় আকার এবং ঝাপসা করার মতো ইভেন্টগুলিকে অনুমতি দেয় এবং এমনকি স্ক্রিপ্টটির মাঝখানে থাকাকালীন পরিচালনাও করা যায় dialogue অপেরা ব্যতীত ব্যস্ত লুপ।

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

  • সম্ভবত আরও কিছুক্ষণ হয়ে গেছে যখন আমি এটি পরীক্ষা করেছি এবং তখন থেকে ব্রাউজারগুলি জটিলতা অর্জন করেছে।

সংক্ষেপে, জাভাস্ক্রিপ্ট বেশিরভাগ ব্যবহারকারীদের কাছে প্রদর্শিত হয়, বেশিরভাগ সময়, কার্যকরভাবে চালিত একক থ্রেড ইভেন্ট চালিত। বাস্তবে এর কোনও জিনিস নেই has এটি কতটা কেবল একটি বাগ এবং কতটা ইচ্ছাকৃত নকশা তা পরিষ্কার নয় তবে আপনি যদি জটিল অ্যাপ্লিকেশনগুলি লিখে থাকেন, বিশেষত ক্রস উইন্ডো / ফ্রেম-স্ক্রিপ্টিংগুলি, তবে এটি আপনাকে দংশিত করতে পারে এমন প্রতিটি সুযোগ রয়েছে - এবং মাঝে মাঝে, হার্ড-টু-ডিবাগ উপায়।

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


14
@ জেপি: ব্যক্তিগতভাবে আমি সরাসরি তাড়াতাড়ি জানতে চাই না কারণ এর অর্থ হল যে আমার কোডটি পুনরায় প্রবেশ করানো হচ্ছে সে সম্পর্কে আমাকে সতর্কতা অবলম্বন করতে হবে, আমার ব্লার কোডটি কল করা এমন কোনও প্রভাব ফেলবে না যে কোনও বাহ্যিক কোড নির্ভর করছে। অনেকগুলি ক্ষেত্রেই অস্পষ্টতা অগত্যা প্রতিটিকে ধরার জন্য একটি অপ্রত্যাশিত পার্শ্ব-প্রতিক্রিয়া। এবং দুর্ভাগ্যবশত এমনকি যদি আপনি কি এটি করতে চান, এটা নির্ভরযোগ্য নয়! আপনার কোড ব্রাউজারে নিয়ন্ত্রণ ফিরে blur আসার পরে IE গুলি ছোঁড়ে ।
বোবিনস

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

34
তবে, মনে রাখবেন সমবায় থ্রেডিং এখনও একক থ্রেডযুক্ত। দুটি জিনিস একসাথে ঘটতে পারে না এটি হ'ল বহু-থ্রেডিং অ-নির্ধারণবাদকে মঞ্জুরি দেয় এবং ইনজেকশন দেয়। যা বর্ণনা করা হয়েছিল তা সমস্তই হতাশাবোধমূলক এবং এ ধরণের সমস্যা সম্পর্কে এটি একটি ভাল অনুস্মারক। বিশ্লেষণে @ ববিন্স
চুবসন্ডবস

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

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

115

আমি হ্যাঁ বলব - কারণ কোনও ব্রাউজারের জাভাস্ক্রিপ্ট ইঞ্জিন যদি এটি অবিচ্ছিন্নভাবে চালিত হয় তবে কার্যত সমস্ত বিদ্যমান (কমপক্ষে সমস্ত অ-তুচ্ছ) জাভাস্ক্রিপ্ট কোডটি ভেঙে যায়।

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

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


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

1
মনে রাখবেন যে একটি একক আছে। প্রধান জেএস থ্রেড, তবে কিছু জিনিস সমান্তরালে ব্রাউজারে চালিত হয়। এটি কেবল বহু-থ্রেডডনেসের ছাপ নয়। অনুরোধগুলি আসলে সমান্তরালে চালিত হয়। আপনি জেএসে যে শ্রোতাগুলি সংজ্ঞায়িত করেছেন তারা একে একে চালানো হয় তবে অনুরোধগুলি সত্যই সমান্তরাল।
Nux

16

হ্যাঁ, যদিও আপনি এখনও সেট-ইনটারওয়াল এবং এক্সএমএলএইচটিপি কলব্যাকের মতো অ্যাসিনক্রোনাস এপিআই ব্যবহার করার সময় সাম্প্রতিক প্রোগ্রামিংয়ের (মূলত রেসের শর্তাদি) কিছু সমস্যা ভুগতে পারেন।


10

হ্যাঁ, যদিও ইন্টারনেট এক্সপ্লোরার 9 আপনার মূল জাভাস্ক্রিপ্টটিকে মূল থ্রেডে কার্যকর করার প্রস্তুতির জন্য পৃথক থ্রেডে সংকলন করবে। যদিও এটি প্রোগ্রামার হিসাবে আপনার জন্য কিছু পরিবর্তন করে না।


8

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

আমি মনে করি যে একক থ্রেডযুক্ত নন-ব্লকিং দৃষ্টান্ত ব্রাউজারগুলিতে জাভাস্ক্রিপ্ট চালানোর প্রয়োজনে এসেছে যেখানে ইউআই কখনই ব্লক করা উচিত নয়।

নোডেজ ব্রাউজারগুলির পদ্ধতির অনুসরণ করেছে ।

রাইনো ইঞ্জিন তবে বিভিন্ন থ্রেডে চলমান জেএস কোডকে সমর্থন করে । ফাঁসিগুলি প্রসঙ্গ ভাগ করতে পারে না, তবে তারা সুযোগ ভাগ করে নিতে পারে। এই নির্দিষ্ট ক্ষেত্রে ডকুমেন্টেশন বলে:

... "গণ্ডার গ্যারান্টী জাভাস্ক্রিপ্ট অবজেক্টের বৈশিষ্ট্য ব্যবহারের থ্রেড জুড়ে পারমাণবিক আছে, কিন্তু দেখা যায় না একই time.If দুটি স্ক্রিপ্ট একযোগে একই সুযোগ ব্যবহার একই সুযোগ নির্বাহ স্ক্রিপ্টের জন্য কোন গ্যারান্টী, স্ক্রিপ্ট হয় অংশীদারি ভেরিয়েবলগুলিতে যে কোনও অ্যাক্সেস সমন্বয় করার জন্য দায়ী ""

রাইনো ডকুমেন্টেশন পড়া থেকে আমি এই সিদ্ধান্তে পৌঁছেছি যে কারও পক্ষে জাভাস্ক্রিপ্ট এপিআই লেখা সম্ভব হতে পারে যা নতুন জাভাস্ক্রিপ্ট থ্রেড তৈরি করে, তবে এপিআই রাইনো-নির্দিষ্ট হবে (যেমন নোড কেবল একটি নতুন প্রক্রিয়া তৈরি করতে পারে)।

আমি কল্পনা করেছি যে জাভাস্ক্রিপ্টে একাধিক থ্রেড সমর্থন করে এমন কোনও ইঞ্জিনের জন্যও স্ক্রিপ্টগুলির সাথে সামঞ্জস্যতা থাকা উচিত যা মাল্টি-থ্রেডিং বা ব্লকিং বিবেচনা করে না।

Concearning ব্রাউজার এবং nodejs আমি এটা দেখুন:

    1. হয় সব JS কোড একটি মৃত্যুদন্ড কার্যকর একক থ্রেড ? : হ্যাঁ।
    1. জেএস কোড অন্য থ্রেড চালানোর কারণ হতে পারে ? : হ্যাঁ।
    1. এই থ্রেড পারেন পরিবর্তন ঘটান JS ফাঁসি প্রসঙ্গ : নং কিন্তু তারা (সরাসরি / পরোক্ষভাবে ()?) থেকে সংযুক্ত করতে পারবেন ঘটনা কিউ যা থেকে শ্রোতারা করতে ফাঁসি প্রসঙ্গ পরিবর্তন ঘটান । তবে বোকা বোকা বানাবেন না, শ্রোতারা আবার মূল সুত্রে পরমাণুভাবে চালান run

সুতরাং, ব্রাউজারগুলি এবং নোডেজগুলির ক্ষেত্রে (এবং সম্ভবত অন্যান্য ইঞ্জিনগুলি প্রচুর পরিমাণে) জাভাস্ক্রিপ্টটি মাল্টিথ্রেড নয় তবে ইঞ্জিনগুলি সেগুলি নিজেরাই


ওয়েব-কর্মীদের সম্পর্কে আপডেট:

ওয়েব-কর্মীদের উপস্থিতি আরও ন্যায়সঙ্গত করে যে জাভাস্ক্রিপ্টটি বহু-থ্রেডড হতে পারে, এই অর্থে যে কেউ জাভাস্ক্রিপ্টে কোড তৈরি করতে পারে যা পৃথক থ্রেডে চলবে।

তবে: ওয়েব-কর্মীরা executionতিহ্যবাহী থ্রেডগুলির সমস্যাগুলিকে ত্রুটিযুক্ত করে না যারা কার্যকর করার প্রসঙ্গে ভাগ করতে পারে। উপরের 2 এবং 3 বিধিগুলি এখনও প্রয়োগ হয় তবে এবার থ্রেডেড কোডটি জাভাস্ক্রিপ্টে ব্যবহারকারী (জেএস কোড লেখক) তৈরি করেছেন।

কেবল বিবেচনার বিষয় হ'ল দক্ষতা (এবং একমত নয় ) দৃষ্টিকোণ থেকে স্পাউড থ্রেডের সংখ্যা । নিচে দেখ:

থ্রেড সুরক্ষা সম্পর্কে :

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

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


পুনশ্চ

তত্ত্ব ছাড়াও, সর্বদা সম্ভাব্য কোণার কেস এবং গ্রহণযোগ্য উত্তরে বর্ণিত বাগগুলি সম্পর্কে প্রস্তুত থাকুন


7

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

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


7

আসলে, প্যারেন্ট উইন্ডো শিশু বা ভাইবোন উইন্ডো বা ফ্রেমের সাথে যোগাযোগ করতে পারে যার নিজস্ব এক্সিকিউশন থ্রেড চলছে।


6

@ বিবিসন সত্যিই অস্বচ্ছ উত্তর সরবরাহ করছে।

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

এটিই একক থ্রেডযুক্ত প্রোগ্রামিং ভাষার কঠোর সংজ্ঞা।


4

না।

আমি এখানে জনতার বিরুদ্ধে যাচ্ছি, তবে আমার সাথে সহ্য কর। একটি একক জেএস স্ক্রিপ্ট কার্যকরভাবে একক থ্রেডযুক্ত করার উদ্দেশ্যে করা হয়েছে , তবে এর অর্থ এই নয় যে এটি আলাদাভাবে ব্যাখ্যা করা যায় না।

ধরা যাক আপনার নিম্নলিখিত কোড রয়েছে ...

var list = [];
for (var i = 0; i < 10000; i++) {
  list[i] = i * i;
}

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

প্রথম থ্রেড

for (var i = 0; i < 5000; i++) {
  list[i] = i * i;
}

দ্বিতীয় থ্রেড

for (var i = 5000; i < 10000; i++) {
  list[i] = i * i;
}

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

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

এই ধারণাটি আরও এগিয়ে নিয়ে যাওয়া, ভিএমএমকে মাল্টি-থ্রেড কোডে কী রূপান্তর করতে হবে তা জানাতে কোডটি এনটোট করা যেতে পারে।

// like "use strict" this enables certain features on compatible VMs.
"use parallel";

var list = [];

// This string, which has no effect on incompatible VMs, enables threading on
// this loop.
"parallel for";
for (var i = 0; i < 10000; i++) {
  list[i] = i * i;
}

যেহেতু ওয়েব ওয়ার্কার্স জাভাস্ক্রিপ্টে আসছেন, এই ... কুরুচিপূর্ণ সিস্টেমটি কখনই অস্তিত্ব লাভের সম্ভাবনা কম, তবে আমি মনে করি জাভাস্ক্রিপ্ট traditionতিহ্যের দ্বারা একক থ্রেডযুক্ত বলা নিরাপদ।


2
সর্বাধিক ভাষার সংজ্ঞাগুলি কার্যকরভাবে একক থ্রেডযুক্ত হওয়ার জন্য ডিজাইন করা হয়েছে এবং উল্লেখ করে যে প্রভাবটি অভিন্ন হিসাবে বহুবর্ষণের অনুমতি দেওয়া হয়। (যেমন ইউএমএল)
জেভন

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

3

ঠিক আছে, ক্রোম মাল্টিপ্রসেস এবং আমি মনে করি প্রতিটি প্রক্রিয়া তার নিজস্ব জাভাস্ক্রিপ্ট কোড নিয়ে কাজ করে, তবে কোডটি যতদূর জানা যায়, এটি "একক থ্রেডেড"।

মাল্টি-থ্রেডিংয়ের জন্য জাভাস্ক্রিপ্টে কোনও সমর্থন নেই, অন্তত স্পষ্টভাবে নয়, তাই এটি কোনও পার্থক্য করে না।


2

আমি @ বোবিন্সের উদাহরণটি কিছুটা পরিবর্তন করে চেষ্টা করেছি:

<html>
<head>
    <title>Test</title>
</head>
<body>
    <textarea id="log" rows="20" cols="40"></textarea>
    <br />
    <button id="act">Run</button>
    <script type="text/javascript">
        let l= document.getElementById('log');
        let b = document.getElementById('act');
        let s = 0;

        b.addEventListener('click', function() {
            l.value += 'click begin\n';

            s = 10;
            let s2 = s;

            alert('alert!');

            s = s + s2;

            l.value += 'click end\n';
            l.value += `result = ${s}, should be ${s2 + s2}\n`;
            l.value += '----------\n';
        });

        window.addEventListener('resize', function() {
            if (s === 10) {
                s = 5;
            }

            l.value+= 'resize\n';
        });
    </script>
</body>
</html>

সুতরাং, যখন আপনি রান টিপুন, সতর্কতা পপআপটি বন্ধ করুন এবং একটি "একক থ্রেড" করুন, আপনার এমন কিছু দেখা উচিত:

click begin
click end
result = 20, should be 20

তবে আপনি যদি উইন্ডোতে অপেরা বা ফায়ারফক্স স্থিতিশীল এ চালানোর চেষ্টা করেন এবং স্ক্রিনে সতর্কতা পপআপ সহ উইন্ডোটি ন্যূনতম / ম্যাক্সিমাইজ করে রাখেন তবে এরকম কিছু হবে:

click begin
resize
click end
result = 15, should be 20

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


-4

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


5
ক্রোম এটি সঠিকভাবে করে, ডান্নো যেখানে @ জেমস এটিকে বহুবিশ্লেষিত হতে দেখেছে ...: setTimeout(function(){setTimeout(function(){console.log('i herd you liek async')}, 0); alert('yo dawg!')}, 0)(রেকর্ডের জন্য, আপনারা ডগ সবসময় আগে আসা উচিত, তারপরে কনসোল লগ আউটপুট)
টোর ভ্যালামো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.