জাভাস্ক্রিপ্টে Mutexes প্রয়োজন?


104

আমি এই লিঙ্কটি দেখেছি: জাভাস্ক্রিপ্টে মিউচুয়াল বর্জন কার্যকর করছে । অন্যদিকে, আমি পড়েছি যে জাভাস্ক্রিপ্টে কোনও থ্রেড নেই, তবে এর অর্থ কী?

ঘটনাগুলি ঘটে গেলে কোডগুলিতে তারা কোথায় বাধা দিতে পারে?

এবং যদি জেএসে কোনও থ্রেড না থাকে, তবে জেএসে আমার কী মুটিেক্স ব্যবহার করা উচিত বা না?

বিশেষত, আমি বিশ্বব্যাপী অ্যাক্সেসযোগ্য ভেরিয়েবলগুলিতে ডেকে setTimeout()এবং XmlHttpRequestএর দ্বারা ব্যবহৃত ফাংশনগুলি ব্যবহারের প্রভাবগুলি সম্পর্কে ভাবছি onreadystatechange


1
না, জাভাস্ক্রিপ্টে কোনও মুটেক্স বা অন্য কোনও সমঝোতা নিয়ন্ত্রণ সরঞ্জাম নেই। জাভাস্ক্রিপ্টে কেন কোনও সমঝোতা নিয়ন্ত্রণ সরঞ্জাম নেই তা দেখুন ।
উজাইর ফারুক

উত্তর:


101

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

এর অর্থ হ'ল একটি ইভেন্টে ঘটে যাওয়া সমস্ত কিছু পরবর্তী ইভেন্ট প্রক্রিয়া করার আগে শেষ করতে হবে।

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

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

আপনি যখন এমন একটি রেসের শর্ত তৈরি করতে পেরেছিলেন তবে আপনার কোডে এটি প্রতিরোধ করা খুব সহজ যেহেতু প্রতিটি ফাংশনটি পারমাণবিক হবে। বাস্তবে রেসের অবস্থা তৈরি করতে এটি অনেক বেশি কাজ হবে এবং কিছু বিজোড় কোডিং নিদর্শন গ্রহণ করবে।


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

19

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

ওয়েব-কর্মীদের উপর নিবন্ধ: ওয়েব ওয়ার্কার্সগুলিতে ওয়েব
ওয়ার্কার্স মজিলা ব্যবহার করে জাভাস্ক্রিপ্টে মাল্টিথ্রেডিং

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


3
অতীত থেকে বিস্ফোরণ, কিন্তু আমি একাধিক ট্যাব একই স্থানীয় স্টোরেজ অ্যাক্সেস করার সময় মিটেক্সগুলির প্রয়োজনের মুখোমুখি হয়েছিল
পিএসপি

3
ওয়েব ওয়ার্কাররা পুনরায় প্রবেশের ক্ষেত্রে প্রভাব ফেলবে না কারণ তারা কোনও পরিবর্তনশীল স্থিতি ভাগ করে না এবং কেবল বার্তা প্রেরণ করে মূল থ্রেডের সাথে যোগাযোগ করে যা ঘটনাকে ট্রিগার করে।
আলনিটাক

9

@ উইলিয়াম যেমন উল্লেখ করেছেন,

আপনার কোডটি এমন কিছু করে যদি আপনার কোডটি এমনটি করে যেখানে অ্যাসিক্রোনাস ইভেন্টটি চালিত হয়েছিল এবং যখন কলব্যাক কল করা হয়েছিল তখন তার মধ্যে কোনও মান পরিবর্তিত হবে না এমন প্রত্যাশা করে you

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

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

var save_lock = false;
$('#save_button').click(function(){
    if(!save_lock){
        //lock
        save_lock=true;
        $.ajax({
            success:function()
                //unlock
                save_lock = false;  
            }
        });
    }
}

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


4
আমি এটিকে একটি মুটেক্স বলব না, কমপক্ষে প্রচলিত অর্থে নয়, কারণ কোনও একক ব্লকের প্রসঙ্গে আপনার দুটি থ্রেড নেই have
ওভেশ

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

1
আপনি মুটেক্সের আনুষ্ঠানিক সংজ্ঞা সম্পর্কে সঠিক। সত্যিকারের বিশ্বে মুটেক্স সম্পর্কে কথা বলার পরে লোকেরা এই বিষয়টিকে খুব কমই মনে করে।
ওভেশ

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

1
চমত্কার নিশ্চিত এই একটি আবৃত করা উচিত whileসঙ্গে setTimeoutবা setIntervalসঙ্গে clearIntervalযাতে আপনি পুনরায় চেষ্টা & সময়সীমার যুক্তিবিজ্ঞান আছে এন ব্যর্থতা পরে। হিসাবে ত্যাগ করার অর্থ আপনি লক হওয়া কেবলমাত্র বাইপাস কোডটি চাইবেন। মুটেক্সেস এবং ভাগ করা অবজেক্টের সাথে বাহ্যিক হ্যান্ডলিংগুলি বাস্তবায়নের মতোই গুরুত্বপূর্ণ important
মিঃমিসিজ

6

জাভাস্ক্রিপ্ট একক থ্রেডযুক্ত ... যদিও ক্রোম একটি নতুন জন্তু হতে পারে (আমার মনে হয় এটি একক থ্রেডযুক্তও রয়েছে, তবে প্রতিটি ট্যাবটির নিজস্ব জাভাস্ক্রিপ্ট থ্রেড রয়েছে ... আমি এটিকে বিস্তারিতভাবে দেখিনি, তাই আমাকে উদ্ধৃতি দেবেন না) সেখানে)।

যাইহোক, আপনাকে যে বিষয়টি চিন্তা করতে হবে তা হ'ল আপনার জাভাস্ক্রিপ্ট কীভাবে একাধিক এজাক্স অনুরোধগুলি হ্যান্ডেল করবে আপনি যেভাবে পাঠিয়েছেন সেভাবে নয় back সুতরাং, আপনাকে যা ভাবতে হবে তা হ'ল আপনার এজাক্স কলগুলি এমনভাবে পরিচালনা করা হয়েছে যাতে ফলাফলগুলি আপনি প্রেরণের চেয়ে ভিন্ন ক্রমে ফিরে আসে তা যদি তারা অন্যের পায়ে না যায়।

এটি টাইমআউটগুলির জন্যও যায় ...

যখন জাভাস্ক্রিপ্ট মাল্টিথ্রেডিং বৃদ্ধি করে, তখন সম্ভবত মুটেক্সেস এবং এর মতো সম্পর্কে চিন্তা করুন ...


4

হ্যাঁ, স্থানীয় স্টোরেজের মতো ট্যাব / উইন্ডোগুলির মধ্যে ভাগ করা সংস্থানগুলিতে অ্যাক্সেস করার সময় জাভাস্ক্রিপ্টে মুটেক্সের প্রয়োজন হতে পারে

উদাহরণস্বরূপ, যদি কোনও ব্যবহারকারীর দুটি ট্যাব খোলা থাকে তবে নীচের মত সাধারণ কোডটি অনিরাপদ is

function appendToList(item) {
    var list = localStorage["myKey"];
    if (list) {
        list += "," + item;
    }
    else {
        list = item;
    }
    localStorage["myKey"] = list;
}

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

আরও বিস্তারিত জানার জন্য নিম্নলিখিত নিবন্ধগুলি দেখুন:


2

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

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

লেখার প্রাচীর জন্য দুঃখিত!


0

ইভেন্টগুলি সিগন্যাল করা হয়, তবে জাভাস্ক্রিপ্ট সম্পাদন এখনও একক থ্রেডযুক্ত।

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

আপনি যদি ভাগ করা ডেটা "সুরক্ষা" দিতে চান তবে সাধারণ বুলিয়ান পতাকা যথেষ্ট হওয়া উচিত।

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