2014-12-06 3 views
1

У меня есть учетная запись Greasemonkey, которая работает в очереди задач. Эта очередь представляет собой кучу сериализованных объектов JSON, разбросанных по частным привилегированным пространствам сценария, для доступа с GM_getValue, GM_setValue и GM_listValues.Синхронизация нескольких экземпляров одного и того же сценария Greasemonkey

Я хотел бы сделать этот скрипт одновременно (тот же компьютер, тот же браузер, разные вкладки), сохраняя общую очередь. Я знаю, что Javascript в основном работает в одном потоке (за исключением Web Workers), но я полагаю, что это не так для страниц, открытых в отдельных вкладках, поэтому он должен запускаться одновременно.

В этом случае, как правильно организовать общий доступ к такому объекту, чтобы предотвратить условия гонки? Появятся ли условия гонки?

ответ

0

Много для моего собственного удивления, кажется, нет условий гонки, потому что Javascript запускается в одном потоке в весь браузер. Я испытал его следующим userscript:.

// ==UserScript== 
// @name  test-concurrency 
// @namespace mw.tools 
// @include  /^http://localhost// 
// @version  1 
// @grant  GM_getValue 
// @grant  GM_setValue 
// ==/UserScript== 

var BLOCK = 1000; 
var ATOM = 'foo'; 
switch (window.location.search) { 
    case '?inc': 
     setInterval(function() { 
      var i; 

      for (i = 0; i < BLOCK; i++) { 
       GM_setValue(ATOM, GM_getValue(ATOM, 0) + 1); 
      } 

      document.title = '' + GM_getValue(ATOM, 0) + ' || ' + (GM_getValue(ATOM, 0) % BLOCK); 
     }, 1); 
     break; 

    case '?ver': 
     setInterval(function() { 
      var v; 
      var v0; 

      v0 = GM_getValue(ATOM); 
      for (i = 0; i < BLOCK; i++) { 
       v = GM_getValue(ATOM); 
       if (v != v0) { 
        document.title = v0 + ' || broken'; 
        alert('BORKEH!!1111oneone'); 
       } 
      } 
      document.title = v0; 
     }, 1); 
     break; 
} 

С большими BLOCK значений, браузер, как представляется, в основном отвечать на запросы, независимо от того, какая вкладка или окно обижая скрипт работает в

Таким образом, для синхронизации скриптов, это достаточно, чтобы сохранить структуру разделяемых разделяемых флагов уже используется, и делать либо случайные интервальные опросы для того, чтобы она стала бесплатной (простой метод, но может голодать), либо использовать postWindow() вещание и поддерживать ожидающую очередь тех, кто хочет приобрести «мьютекс», , реализующий Monitor (вроде, потому что каждый вызов скрипта находится в критическом разделе).

+0

Чтобы проверить состояние гонки, 2 потока должны пытаться изменить одну и ту же переменную, которую вы здесь не делаете. – Dalius

Смежные вопросы