এটি কি ইচ্ছাকৃত ডিজাইনের সিদ্ধান্ত বা আমাদের বর্তমান দিনের ব্রাউজারগুলির একটি সমস্যা যা আসন্ন সংস্করণগুলিতে সংশোধন করা হবে?
এটি কি ইচ্ছাকৃত ডিজাইনের সিদ্ধান্ত বা আমাদের বর্তমান দিনের ব্রাউজারগুলির একটি সমস্যা যা আসন্ন সংস্করণগুলিতে সংশোধন করা হবে?
উত্তর:
জাভাস্ক্রিপ্ট মাল্টি-থ্রেডিং সমর্থন করে না কারণ ব্রাউজারে জাভাস্ক্রিপ্ট ইন্টারপ্রেটার একক থ্রেড (এএফএআইকি)। এমনকি গুগল ক্রোম একক ওয়েব পৃষ্ঠার জাভাস্ক্রিপ্ট একযোগে চলতে দেয় না কারণ এটি বিদ্যমান ওয়েব পৃষ্ঠাগুলিতে প্রচুর সম্মিলিত সমস্যার কারণ হতে পারে। সমস্ত ক্রোম হ'ল পৃথক প্রক্রিয়াগুলিতে একাধিক উপাদান (বিভিন্ন ট্যাব, প্লাগইনস, ইত্যাদি) আলাদা করা যায়, তবে আমি একক পৃষ্ঠাতে একাধিক জাভাস্ক্রিপ্ট থ্রেড ধারণ করতে পারি না।
যাইহোক আপনি setTimeout
কিছু ধরণের শিডিয়ুলিং এবং "জাল" সম্মিলনের অনুমতি দেওয়ার জন্য প্রস্তাবিত হিসাবে ব্যবহার করতে পারেন । এর ফলে ব্রাউজারটি রেন্ডারিং থ্রেডের নিয়ন্ত্রণ আবার ফিরে পেতে এবং জাভাস্ক্রিপ্ট কোড সরবরাহ করা setTimeout
মিলিসেকেন্ডের প্রদত্ত সংখ্যার পরে শুরু করে । এটি খুব কার্যকর যদি আপনি ভিউপোর্টকে (যা দেখছেন) এতে অপারেশন করার সময় তাজা করার অনুমতি দিতে চান। উদাহরণস্বরূপ স্থানাঙ্কগুলির মধ্য দিয়ে লুপিং করা এবং তদনুসারে একটি উপাদান আপডেট করা আপনাকে শুরু এবং শেষের অবস্থানগুলি এবং এর মধ্যে কিছুই দেখতে দেয়।
আমরা জাভাস্ক্রিপ্টে একটি বিমূর্ত গ্রন্থাগার ব্যবহার করি যা আমাদের প্রক্রিয়া এবং থ্রেড তৈরি করতে দেয় যা সমস্ত একই জাভাস্ক্রিপ্ট দোভাষী দ্বারা পরিচালিত হয়। এটি আমাদের নিম্নলিখিত পদ্ধতিতে ক্রিয়া চালাতে সহায়তা করে:
এটি কিছু সূচি নির্ধারণ করে এবং সামঞ্জস্যকে জাল করে, থ্রেড শুরু করে এবং বন্ধ করে দেয়, ইত্যাদি, তবে এটি সত্য মাল্টি-থ্রেডিং হবে না। আমি মনে করি না যে এটি কখনই ভাষাতেই প্রয়োগ করা হবে, যেহেতু সত্যিকারের মাল্টি-থ্রেডিং কেবল তখনই কার্যকর যখন ব্রাউজারটি একটি পৃষ্ঠায় একাধিক থ্রেডযুক্ত (বা একাধিক কোর )ও চালাতে পারে এবং সেখানে সমস্যাগুলি আরও বড়তর হয় অতিরিক্ত সম্ভাবনার চেয়ে।
জাভাস্ক্রিপ্টের ভবিষ্যতের জন্য, এটি দেখুন: https://developer.mozilla.org/preferencesations/xtech2006/javascript/
জাভাস্ক্রিপ্ট মাল্টি থ্রেডিং (কিছু সীমাবদ্ধতা সহ) এখানে। গুগল গিয়ার্সের জন্য কর্মী বাস্তবায়িত করেছে এবং এইচটিএমএল 5 এর সাথে শ্রমিকদের অন্তর্ভুক্ত করা হচ্ছে। বেশিরভাগ ব্রাউজার ইতিমধ্যে এই বৈশিষ্ট্যের জন্য সমর্থন যোগ করেছে।
ডেটা থ্রেড-সুরক্ষা গ্যারান্টিযুক্ত কারণ কর্মীর কাছে / থেকে সমস্ত ডেটা যোগাযোগ করা সিরিয়ালযুক্ত / অনুলিপি করা হয়।
আরও তথ্যের জন্য, পড়ুন:
Ditionতিহ্যগতভাবে, জেএস সংক্ষিপ্ত, দ্রুত চলমান কোডের টুকরাগুলির জন্য তৈরি হয়েছিল। যদি আপনার বড় গণনা চলতে থাকে তবে আপনি এটি একটি সার্ভারে করেছেন - একটি জেএস + এইচটিএমএল অ্যাপ্লিকেশনটির ধারণা যা আপনার ব্রাউজারে দীর্ঘ সময় ধরে অ-তুচ্ছ বিষয়গুলি চালিয়ে যায়।
অবশ্যই, এখন আমাদের এটি আছে। তবে, ব্রাউজারগুলি ধরতে কিছুটা সময় লাগবে - তাদের বেশিরভাগই একক থ্রেডযুক্ত মডেলের আশেপাশে ডিজাইন করা হয়েছে এবং এটি পরিবর্তন করা সহজ নয়। গুগল গিয়ারগুলি ব্যাকগ্রাউন্ড এক্সিকিউশনটি বিচ্ছিন্ন করে দিয়ে প্রয়োজনীয় সংখ্যক সম্ভাব্য সমস্যাগুলি সাইড-স্টেপ করে - ডিওএম পরিবর্তন করে না (যেহেতু এটি থ্রেড-নিরাপদ নয়), মূল থ্রেড (ডাইটো) দ্বারা তৈরি কোনও অ্যাক্সেসিং অবজেক্ট নেই। সীমাবদ্ধ থাকাকালীন, এটি সম্ভবত অদূর ভবিষ্যতের জন্য সর্বাধিক ব্যবহারিক ডিজাইন, কারণ এটি ব্রাউজারের নকশাটিকে সহজতর করে এবং কারণ এটি অনভিজ্ঞ জেএস কোডারদের সাথে থ্রেডের সাথে জগাখিচু করার অনুমতি দেওয়ার সাথে জড়িত ঝুঁকি হ্রাস করে ...
@মারসিও :
কেন এটি জাভাস্ক্রিপ্টে মাল্টি-থ্রেডিং বাস্তবায়ন না করার কারণ? প্রোগ্রামাররা তাদের কাছে থাকা সরঞ্জামগুলি দিয়ে যা খুশি করতে পারে।
সুতরাং, আসুন তাদের এমন সরঞ্জামগুলি না দিন যা অপব্যবহারের পক্ষে এত সহজ যে আমি খোলার প্রতিটি অন্যান্য ওয়েবসাইট আমার ব্রাউজারটি ক্র্যাশ করে। এটির একটি নিখুঁত বাস্তবায়ন আপনাকে সরাসরি সেই অঞ্চলে নিয়ে আসবে যা আই 7 বিকাশের সময় এমএসকে এত বেশি মাথা ব্যথার কারণ করেছিল: অ্যাড-অন লেখকরা থ্রেডিং মডেলটির সাথে দ্রুত এবং আলগা খেলতেন, ফলস্বরূপ লুকানো বাগগুলি যখন প্রাথমিক থ্রেডে অবজেক্ট লাইফাইকেলগুলি পরিবর্তিত হয় তখন স্পষ্ট হয়ে ওঠে । খারাপ। আপনি যদি IE এর জন্য মাল্টি-থ্রেডেড অ্যাক্টিভ্যাক্স অ্যাড-অনগুলি লেখেন তবে আমার ধারণা এটি অঞ্চলটি নিয়ে আসে; এর অর্থ এই নয় যে এর চেয়ে আরও কিছুদূর যেতে হবে।
আমি এই সিদ্ধান্তের যৌক্তিকতা জানি না, তবে আমি জানি যে আপনি সেটটাইমআউট ব্যবহার করে মাল্টি-থ্রেডেড প্রোগ্রামিংয়ের কিছু সুবিধা অনুকরণ করতে পারেন। আপনি একই সাথে একাধিক প্রক্রিয়াগুলি করার কাজ করার বিভ্রমটি দিতে পারেন, যদিও বাস্তবে, সমস্ত কিছুই এক থ্রেডে ঘটে।
আপনার ফাংশনটিতে কিছুটা কাজ করতে হবে এবং তারপরে এমন কিছু কল করুন:
setTimeout(function () {
... do the rest of the work...
}, 0);
এবং অন্য যে কোনও কাজ করা দরকার (যেমন ইউআই আপডেট, অ্যানিমেটেড চিত্রগুলি ইত্যাদি) তারা যখন সুযোগ পাবে তখন ঘটবে।
loop
অভ্যন্তর ব্যবহার করতে চাই setTimeout
তবে দৃশ্যত এটি কাজ করে না। আপনি কি এরকম কিছু করেছেন বা আপনার একটি হ্যাক আছে? উদাহরণস্বরূপ 1000 এলিমেন্টের অ্যারের জন্য হবে, আমি দুটি setTimeout
কলের ভিতরে লুপের জন্য দুটি ব্যবহার করার প্রত্যাশা করি যেটি প্রথম লুপগুলি মাধ্যমে এবং প্রিন্ট উপাদানটি 0..499
, দ্বিতীয় লুপের মাধ্যমে এবং মুদ্রণ উপাদানটি দিয়ে যায় 500..999
।
আপনি কি বোঝাতে চেয়েছেন যে ভাষাটি মাল্টিথ্রেডিং সমর্থন করে না বা ব্রাউজারগুলিতে জাভাস্ক্রিপ্ট ইঞ্জিনগুলি মাল্টিথ্রেডিং সমর্থন করে না কেন?
প্রথম প্রশ্নের উত্তর হ'ল ব্রাউজারে জাভাস্ক্রিপ্ট বোঝানো হচ্ছে একটি স্যান্ডবক্সে এবং একটি মেশিন / ওএস-স্বতন্ত্র উপায়ে চালানো, মাল্টিথ্রেডিং সমর্থন যুক্ত করা ভাষাটিকে জটিল করে তুলবে এবং ভাষাটিকে ওএসের সাথে খুব কাছাকাছি বেঁধে ফেলবে।
নোড.জেএসএস 10.5+ পরীক্ষামূলক বৈশিষ্ট্য হিসাবে কর্মী থ্রেডগুলিকে সমর্থন করে (আপনি এটি - এক্সপেরিমেন্টাল-কর্মী পতাকা সহ সক্ষম করতে পারেন ): https://nodejs.org/api/worker_threads.html
সুতরাং, নিয়মটি হ'ল:
কর্মী থ্রেডগুলি দীর্ঘস্থায়ী থ্রেডগুলির উদ্দেশ্যে করা হয়, যার অর্থ আপনি ব্যাকগ্রাউন্ড থ্রেড রেখেছিলেন এবং তারপরে আপনি বার্তা প্রেরণের মাধ্যমে এর সাথে যোগাযোগ করেন।
অন্যথায়, যদি আপনাকে কোনও বেনাম ফাংশন সহ ভারী সিপিইউ লোড চালানোর প্রয়োজন হয়, তবে আপনি https://github.com/wilk/microjob , কর্মী থ্রেডের চারপাশে নির্মিত একটি ছোট লাইব্রেরির সাথে যেতে পারেন ।
ম্যাট বি যেমন বলেছেন, প্রশ্নটি খুব পরিষ্কার নয়। ধরে নিই যে আপনি ভাষাটিতে মাল্টিথ্রেডিং সমর্থন সম্পর্কে জিজ্ঞাসা করছেন: কারণ বর্তমানে ব্রাউজারে চলমান অ্যাপ্লিকেশনগুলির 99.999% এর প্রয়োজন নেই। আপনার যদি সত্যিই এটির প্রয়োজন হয় তবে কার্যকারিতা রয়েছে (উইন্ডো.সেটটাইমআউট ব্যবহার করার মতো)।
সাধারণভাবে মাল্টিথ্রেডিং খুব, খুব, খুব, খুব, খুব, খুব শক্ত (আমি কি বলেছিলাম যে এটি শক্ত?) যদি না আপনি অতিরিক্ত বিধিনিষেধ না রাখেন (তবে কেবলমাত্র অপরিবর্তনীয় ডেটা ব্যবহার করার মতো) right
ইন্টেল জাভাস্ক্রিপ্টে মাল্টিথ্রেডিংয়ের বিষয়ে কিছু মুক্ত-উত্স গবেষণা করছে, এটি সম্প্রতি জিডিসিতে 2012 সালে প্রদর্শিত হয়েছিল Here ভিডিওটির লিঙ্কটি এখানে । গবেষণা গোষ্ঠীটি ওপেনসিএল ব্যবহার করেছে যা প্রাথমিকভাবে ইন্টেল চিপ সেট এবং উইন্ডোজ ওএসকে কেন্দ্র করে। প্রকল্পটি কোড-নামের রিভারট্রাইল এবং কোডটি গিটহাবটিতে উপলব্ধ
আরও কিছু দরকারী লিঙ্ক:
ওয়েব অ্যাপ্লিকেশনগুলির জন্য একটি কম্পিউটিং হাইওয়ে তৈরি করা
বর্তমানে কিছু ব্রাউজার মাল্টিথ্রেডিং সমর্থন করে। সুতরাং, আপনার যদি প্রয়োজন হয় আপনি নির্দিষ্ট গ্রন্থাগার ব্যবহার করতে পারেন। উদাহরণস্বরূপ, পরবর্তী উপকরণগুলি দেখুন:
https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers (ব্যাকগ্রাউন্ড থ্রেড সমর্থন করুন);
https://keithwhor.github.io/multithread.js/ (গ্রন্থাগার)।
এটি এমন বাস্তবায়ন যা বহু-থ্রেডিং সমর্থন করে না। বর্তমানে গুগল গিয়ার্স বাহ্যিক প্রক্রিয়াগুলি সম্পাদন করে কিছু রূপসতর্কতা ব্যবহারের একটি উপায় সরবরাহ করছে তবে এটি প্রায়।
নতুন ব্রাউজার গুগল আজ প্রকাশ করার কথা রয়েছে (গুগল ক্রোম) এটিকে প্রক্রিয়াতে আলাদা করে সমান্তরালভাবে কিছু কোড কার্যকর করে।
মূল ভাষাটি অবশ্যই জাভা বলার মতোই সমর্থন করতে পারে তবে এরলংয়ের সমঝোতার মতো কোনও কিছুর জন্য সমর্থন দিগন্তের কাছাকাছি কোথাও নেই।
জাভাস্ক্রিপ্ট একক থ্রেডযুক্ত ভাষা। এর অর্থ এটির একটি কল স্ট্যাক এবং একটি মেমোরি হিপ রয়েছে। যেমনটি প্রত্যাশিত, এটি কোডটি কার্যকরভাবে কার্যকর করে এবং পরবর্তীটিতে যাওয়ার আগে একটি টুকরা কোডটি কার্যকর করতে হবে। এটি সিনক্রোনাস, তবে এমন সময়ে ক্ষতিকারক হতে পারে। উদাহরণস্বরূপ, যদি কোনও ক্রিয়াকলাপ সম্পাদন করতে কিছুটা সময় নেয় বা কোনও কিছুর জন্য অপেক্ষা করতে হয় তবে এর মধ্যে এটি সবকিছু হিমশীতল করে দেয়।
থ্রেড সিঙ্ক্রোনাইজেশনের জন্য যথাযথ ভাষা সমর্থন ব্যতীত, নতুন বাস্তবায়নের চেষ্টা করার জন্য এটি কোনও অর্থবোধ করে না। বিদ্যমান জেএস অ্যাপ্লিকেশন (উদাহরণস্বরূপ ExtJS ব্যবহার করে যে কোনও কিছুই) সম্ভবত অপ্রত্যাশিতভাবে ক্রাশ হবে, তবে কোনও synchronized
কীওয়ার্ড বা অনুরূপ কিছু না থাকলে সঠিকভাবে আচরণ করে এমন নতুন প্রোগ্রাম লিখতে খুব শক্ত বা এমনকি অসম্ভবও হতে পারে।
তবে আপনি কিছু এক্সটেনশনে সম্মতি আনতে ইওল ফাংশনটি ব্যবহার করতে পারেন
/* content of the threads to be run */
var threads = [
[
"document.write('Foo <br/>');",
"document.write('Foo <br/>');",
"document.write('Foo <br/>');",
"document.write('Foo <br/>');",
"document.write('Foo <br/>');",
"document.write('Foo <br/>');",
"document.write('Foo <br/>');",
"document.write('Foo <br/>');",
"document.write('Foo <br/>');",
"document.write('Foo <br/>');"
],
[
"document.write('Bar <br/>');",
"document.write('Bar <br/>');",
"document.write('Bar <br/>');",
"document.write('Bar <br/>');",
"document.write('Bar <br/>');",
"document.write('Bar <br/>');",
"document.write('Bar <br/>');",
"document.write('Bar <br/>');",
"document.write('Bar <br/>');"
]
];
window.onload = function() {
var lines = 0, quantum = 3, max = 0;
/* get the longer thread length */
for(var i=0; i<threads.length; i++) {
if(max < threads[i].length) {
max = threads[i].length;
}
}
/* execute them */
while(lines < max) {
for(var i=0; i<threads.length; i++) {
for(var j = lines; j < threads[i].length && j < (lines + quantum); j++) {
eval(threads[i][j]);
}
}
lines += quantum;
}
}
ওয়েব ওয়ার্কার্স এইচটিএমএল 5 নিয়ে আসা ব্যবহার করে জাভাস্ক্রিপ্টের সাথে একাধিক থ্রেডিং স্পষ্টভাবে সম্ভব।
ওয়েব ওয়ার্কার্স এবং একটি স্ট্যান্ডার্ড মাল্টি-থ্রেডিং পরিবেশের মধ্যে প্রধান পার্থক্য হ'ল মেমরি রিসোর্সগুলি মূল থ্রেডের সাথে ভাগ করা হয় না, কোনও বস্তুর উল্লেখ একটি থ্রেড থেকে অন্য থ্রেডে দৃশ্যমান হয় না। থ্রেডগুলি বার্তাগুলির আদান প্রদানের মাধ্যমে যোগাযোগ করে, সুতরাং ইভেন্ট-চালিত ডিজাইনের ধরণ অনুসরণ করে একটি সিঙ্ক্রোনাইজেশন এবং সমবর্তী পদ্ধতি কল অ্যালগরিদম বাস্তবায়ন সম্ভব।
অনেকগুলি ফ্রেমওয়ার্কগুলি থ্রেডগুলির মধ্যে প্রোগ্রামিং গঠনের অনুমতি দেয়, যার মধ্যে OODK-JS, একটি ওওপি জেএস ফ্রেমওয়ার্ক সহবর্তী প্রোগ্রামিং সমর্থন করে https://github.com/GOMServices/oodk-js-oop-for-js