2013-01-14 21 views
15

मैं अपनी ज़रूरतों के लिए एक क्रॉस टैब म्यूटेक्स को लागू करने की कोशिश कर रहा हूं। मुझे एक कार्यान्वयन here मिला। जो काफी आशाजनक लगता है। असल में, यह Leslie Lamport's algorithm लागू करता है जिसमें म्यूटेक्स बनाने के लिए परमाणु पढ़ने/लिखने की ज़रूरत होती है।ब्राउजर में कुकी पढ़ने/लिखने पर कुकी

हालांकि यह स्थानीय स्टोरेज पर परमाणु पढ़ने/लिखने पर निर्भर करता है। यह क्रोम को छोड़कर अधिकांश ब्राउज़रों में अच्छी तरह से काम करता है।

तो मेरा सवाल है, क्या मैं इसके बजाय कुकी पढ़ने/लिखने का उपयोग कर सकता हूं? कुकी सभी मुख्यधारा के ब्राउज़रों (आईई, क्रोम, सफारी, फ़ायरफ़ॉक्स) में परमाणु पढ़ता/लिखता है?

+0

यह बहुत ही स्वीकार्य उपयोग कुकीज़ है? – lindosekai

+1

becouse localStorage अब क्रोम – lindosekai

उत्तर

5

न तो कुकीज़, न ही localStorage परमाणु लेनदेन प्रदान करते हैं।

मुझे लगता है कि आप गलत समझा हो सकता है ब्लॉग पोस्ट, यह कहना नहीं है कि उसके कार्यान्वयन क्रोम में काम नहीं करता है, यह परमाणु पढ़ने उपलब्ध कराने localStorage पर निर्भर नहीं करता/लिखते हैं। वह कहता है कि सामान्यlocalStorage एक्सेस क्रोम में अधिक अस्थिर है। मुझे लगता है कि यह इस तथ्य से संबंधित है कि क्रोम प्रत्येक टैब के लिए एक अलग प्रक्रिया का उपयोग करता है, जबकि अधिकांश अन्य ब्राउज़र सभी टैब के लिए एक ही प्रक्रिया का उपयोग करते हैं। उसका कोड localStorage के शीर्ष पर लॉकिंग सिस्टम लागू करता है जिसे ओवरराइट करने वाली चीज़ों के विरुद्ध सुरक्षा करनी चाहिए।

एक और समाधान IndexedDB का उपयोग करना होगा। इंडेक्सड डीबी परमाणु लेनदेन प्रदान करता है। एक नया मानक होने के नाते यह localStorage के रूप में कई ब्राउज़रों में समर्थित नहीं है, लेकिन फ़ायरफ़ॉक्स, क्रोम और आईई 10 के हाल के संस्करणों में इसका अच्छा समर्थन है।

+1

में महान काम करता है IndexedDB के बारे में अच्छी युक्ति। दूसरा यह है कि ब्लॉग पोस्ट गलत समझा गया था। क्रोम और ओपेरा एक ही स्थानीय स्टोरेज पैरामीटर तक पहुंच के साथ एकाधिक प्रक्रिया/थ्रेड होने के कारण सबसे अधिक समस्याएं प्रदर्शित करते हैं। जबकि प्रत्येक पढ़ना या लिखना ऑपरेशन परमाणु है, एक रीड-टेस्ट-मोडिफ़ी-लिखने अनुक्रम को निर्बाध होने की गारंटी नहीं दी जा सकती है। आम तौर पर जावास्क्रिप्ट में आपको कोड पूर्व-खाली होने के बारे में चिंता करने की ज़रूरत नहीं है, हालांकि स्थानीय स्टोरेज को एकाधिक प्रक्रिया/धागे के बीच साझा किया जाता है, कोई भी इस सामान्य जावास्क्रिप्ट व्यवहार पर भरोसा नहीं कर सकता है। ब्लॉग में वर्णित कार्यान्वयन इस सटीक मुद्दे को संबोधित करना है। – Stefan

+0

ध्यान दें कि 'स्थानीय स्टोरेज' के लिए, एकल लिखते हैं * परमाणु हैं। Https://html.spec.whatwg.org/multipage/webstorage.html#the-storage-interface ("setItem() और removeItem() विधियों को विफलता के संबंध में परमाणु होना चाहिए। विफलता के मामले में, विधि कुछ नहीं करता है। ")। – ulrichb

0

नहीं। यहां तक ​​कि यदि ब्राउज़र संभवतः कुकी पर एक पठन और लिखने के लॉक को लागू करते हैं, तो यह आपको पढ़ने और परिणामस्वरूप लिखने के बीच होने वाले परिवर्तनों से बचाएगा। javascript API for cookies को देखकर देखना आसान है, वहां कोई म्यूटेक्स कार्यक्षमता नहीं है ...

0

मैं आज localStorage का उपयोग कर इस संगामिति मुद्दा में भाग (दो साल में परिवर्तन ..)

परिदृश्य: एक ब्राउज़र (जैसे क्रोम) के एकाधिक टैब समान स्क्रिप्ट कोड का निष्पादित कि, मूल रूप से एक ही समय में है (बुलाया उदाहरण के लिए सिग्नलआर)। कोड स्थानीय स्टोरेज को पढ़ता है और लिखता है। चूंकि टैब विभिन्न प्रक्रियाओं में चलते हैं लेकिन सामूहिक रूप से साझा स्थानीय संग्रहण तक पहुंचते हैं, पढ़ना और लिखना अनिर्धारित परिणामों की ओर जाता है क्योंकि लॉकिंग तंत्र यहां गायब है। मेरे मामले में मैं यह सुनिश्चित करना चाहता था कि टैब में से केवल एक ही वास्तव में स्थानीय भंडारण के साथ काम करता है और उनमें से सभी नहीं ..

मैंने ऊपर दिए गए प्रश्न में बेंजामिन Dumke-von der Ehe की लॉकिंग तंत्र की कोशिश की लेकिन मुझे मिला अवांछित परिणाम।

localStorage ताला:

Object.getPrototypeOf(localStorage).lockRndId = new Date().getTime() + '.' + Math.random(); 
Object.getPrototypeOf(localStorage).lock = function (lockName, maxHold, callback) { 
    var that = this; 
    var value = this.getItem(lockName); 
    var start = new Date().getTime();  
    var wait = setInterval(function() { 
     if ((value == null) || (parseInt(value.split('_')[1]) + maxHold < start)) { 
      that.setItem(lockName, that.lockRndId + '_' + start); 
      setTimeout(function() { 
       if (that.getItem(lockName) == (that.lockRndId + '_' + start)) { 
        clearInterval(wait); 
        try { callback(); } 
        catch (e) { throw 'exeption in user callback'; } 
        finally { localStorage.removeItem(lockName); } 
       } 
      }, 100); 
     }   
    }, 200);   
}; 

उपयोग:

localStorage तो मैं अपने ही प्रयोगात्मक कोड रोल करने का फैसला किया।लॉक (लॉकनाम, maxHold, कॉलबैक);

  • lockName - ताला के लिए एक वैश्विक गुंजाइश अद्वितीय नाम - स्ट्रिंग
  • maxHold - मिलीसेकेंड में स्क्रिप्ट की रक्षा के लिए अधिक से अधिक समय - पूर्णांक
  • कॉलबैक - समारोह स्क्रिप्ट से युक्त यह सुरक्षित हो जाता है

उदाहरण: "केवल एक ध्वनि चलाएं ई टैब "

//var msgSound = new Audio('/sounds/message.mp3'); 

localStorage.lock('lock1', 5000, function(){ 

    // only one of the tabs/browser processes gets here at a time 
    console.log('lock aquired:' + new Date().getTime()); 

    // work here with local storage using getItem, setItem 

    // e.g. only one of the tabs is supposed to play a sound and only if none played it within 3 seconds   
    var tm = new Date().getTime(); 
    if ((localStorage.lastMsgBeep == null)||(localStorage.lastMsgBeep <tm-3000)) { 
     localStorage.lastMsgBeep = tm; 
     //msgSound.play();      
     console.log('beep');       
    } 
});