2012-02-18 77 views
6

我试着去创建web工人和岗位信息给他们的循环:是否存在Firefox Worker限制?

array.forEach(function (data) { 
     this.createWorker(); 
     this.workers[this.workersPointer].postMessage({task: 'someTask', data: string}); 
    }, this); 

createWorker功能:

createWorker: function() { 
    this.workersPointer++; 
    var worker = this.workers[this.workersPointer] = new Worker('Worker.js'), 
     storage = this; 
    worker.onmessage = function (event) { 
     if (event.data.error) { 
      storage[event.data.task + 'Errback'](event.data.error); 
     } 
     else { 
      storage[event.data.task + 'Callback'](event.data.data); 
     } 
    }; 
    worker.onerror = function (error) { 
     storage.workerErrback(error); 
    }; 
} 

工人代码:

self.addEventListener('message', function (event) { 
self.postMessage({ 
    data: data, 
    error: err, 
    task: event.data.task 
}); 

},假);

它在谷歌浏览器中完美运行。当我试图在Firefox中运行它时,它只能运行20次。 Firefox网络工作者是否有限制?我在mozilla.org上找不到关于它的信息。如果没有限制,问题是什么?有任何想法吗?

回答

5

刚做了一些我自己的测试。对于这一点,我改变了代码一点点:

周期:

for(var i=0;i<200;i++){ 
    this.createWorker(); 
    this.workers[this.workersPointer].postMessage({task: 'someTask', number:i}); 
}; 

createWorker功能:

this.workers =[]; 
this.workersPointer = 0; 
storage=[]; 


var createWorker= function() { 
    workersPointer++; 
    var myPointer = workersPointer; 
    var worker = this.workers[this.workersPointer] = new Worker('Worker.js'); 

    worker.onmessage = function (event) { 
     if (event.data.error) { 
      alert(event.data.error); 
     } 
     else { 
      document.cookie=event.data.task+"["+myPointer+"]="+event.data.number; 
     } 
    }; 
    worker.onerror = function (event) { 
     alert("Error: " + event.error); 
    }; 
} 

工人:

onmessage = function(event) { 
    postMessage({number:event.data.number*2, task: event.data.task}); 
}; 

我跑在此之后,在铬我有66个饼干(包括一个漂亮的蓝色崩溃窗口),在firefox中我有20个。所以这两个浏览器似乎都有工作人员itations。

编辑:

在Opera中,我得到一个控制台消息:

Web工作的最大实例数(16)超过了此窗口。

+0

只是想知道,为什么我没有找到谷歌与“Firefox的工作人员限制”查询...以及为什么没有错误消息在Firefox和Chrome。 – 2012-02-18 09:47:49

+0

这里是一个铬错误提交: http://code.google.com/p/chromium/issues/detail?id=37518 – Alex 2012-02-18 09:51:49

+4

没有错误信息,因为如果你创造更多的工人超过限制,他们只是排队去运行。限制是同时运行的工人,而不是总工人。如果你设立的工人实际上在某个时候终止了,你会看到排队的人开始跑步。但是你试图设置200名工人,并且生命无限...... – 2012-02-19 05:03:58

6

有在Firefox的设置,叫“dom.workers.maxPerDomain”默认情况下是20

但是,可能没有任何实际的性能增益,使用更多的工人比你的核心电脑。今天有一台具有超线程的现代计算机,我认为使用大约8名工人就足够了。否则,你可能会导致很多上下文切换,而不是引入瓶颈。

这一切都取决于,但你想达到什么。

+1

这是真的,如果你在工人内部做一些真正的计算。但是,如果你正在做缓慢的Ajax调用,这可能会成为一个真正的限制。 – Alex 2012-02-18 10:02:59

0

我也和工人一起玩过,试图找到一个最适合我的情况(加密字符串)。也是8。

类似的问题和讨论:Number of Web Workers Limit

1

获得进一步的参考检查出在Firefox

about:config中

有一个名为参数:

dom.workers 。maxPerDomain

WICH(至少在FF 33)被设置为20。

GL的一个默认值。

,并作为this other stackoverflow question:

指出每个浏览器都有网络工作者的局限性(Firefox拥有20时,Chrome 60+,歌剧16);不过,您可以在Firefox中更改它 - > dom.workers.maxPerDomain;至于你的实际问题,如果你能或不能避免这个限制,我不确定。 “工人们(因为这些背景文字在这里被称为)相对较重,并不打算大量使用。”你能否给出一个确切的情况,你想要使用20多名工人? - - Marius Balaban 12年11月12日在22:34

相关问题