2012-02-18 41 views
6

Im cố gắng tạo lao động web và đăng bài để chúng trong chu kỳ:Giới hạn của Firefox Worker có tồn tại không?

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

chức năng createWorker: Mã

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); 
    }; 
} 

Worker:

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

}, false);

Nó hoạt động hoàn hảo trong Google Chrome. Khi tôi cố gắng chạy nó trong Firefox, nó chỉ hoạt động 20 lần. Những người làm web Firefox có giới hạn không? Tôi không thể tìm thấy thông tin về nó trên mozilla.org. Nếu không có giới hạn, vấn đề là gì? Bất kỳ ý tưởng?

Trả lời

5

Chỉ cần làm một số thử nghiệm của riêng tôi. Đối với điều này, tôi đã thay đổi mã một chút:

Cycle:

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

chức năng 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); 
    }; 
} 

Worker:

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

Sau khi tôi chạy này, trong chrome tôi đã có 66 cookie (bao gồm cả một cửa sổ tai nạn màu xanh), trong firefox tôi có 20. Vì vậy, cả hai trình duyệt dường như có nhân viên lim itations.

EDIT:

Trong Opera tôi nhận được một thông điệp console:

Số lượng tối đa các trường hợp người lao động Web (16) vượt quá đối với cửa sổ này.

+0

tự hỏi tại sao tôi không tìm thấy bất kỳ thứ gì trong Google với "giới hạn nhân viên web firefox" ... Và tại sao không có thông báo lỗi trong Firefox và Chrome. –

+0

Đây là lỗi crom gửi: http://code.google.com/p/chromium/issues/detail?id=37518 – Alex

+4

Không có thông báo lỗi vì nếu bạn tạo nhiều công nhân hơn giới hạn họ chỉ được xếp hàng đợi để chạy. Giới hạn trên đồng thời là công nhân chạy, không phải tổng số công nhân. Nếu bạn đã thiết lập công nhân thực sự chấm dứt tại một thời điểm nào đó, bạn sẽ thấy những người được xếp hàng đợi bắt đầu chạy. Nhưng bạn đang cố gắng thiết lập 200 công nhân tất cả với thời gian vô hạn ... –

6

Có một thiết lập trong Firefox, được gọi là "dom.workers.maxPerDomain" mà là theo mặc định 20.

Tuy nhiên, có thể không đạt được hiệu suất thực trong việc sử dụng nhiều lao động hơn bạn có lõi trong máy vi tính. Với một máy tính hiện đại ngày nay có siêu luồng, tôi nghĩ việc sử dụng khoảng 8 công nhân sẽ là đủ. Nếu không, bạn có thể gây ra nhiều bối cảnh chuyển đổi mà thay vào đó sẽ giới thiệu một nút cổ chai.

Tất cả đều phụ thuộc vào những gì bạn muốn đạt được.

+1

Điều này đúng, nếu bạn thực hiện một số tính toán thực sự bên trong công nhân. Nhưng nếu bạn đang thực hiện các cuộc gọi ajax chậm, điều này có thể trở thành giới hạn thực sự. – Alex

0

Tôi cũng chơi xung quanh với người lao động và cố gắng tìm một trường hợp tối ưu cho trường hợp của tôi (mã hóa chuỗi). Đó cũng là 8.

tương tự câu hỏi và thảo luận: Number of Web Workers Limit

1

Để tham khảo thêm tác kiểm tra trong Firefox

about: config

Có một tham số gọi là:

dom.workers .maxPerDomain

Mà (ít nhất là trong FF 33) được đặt thành một giá trị mặc định 20.

gl.

Và như đã nói ở trên this other stackoverflow question:

Mỗi trình duyệt có nhân viên web hạn chế (Firefox có 20, Chrome 60, Opera 16); tuy nhiên, bạn có thể thay đổi nó trong Firefox -> dom.workers.maxPerDomain; đối với câu hỏi thực tế của bạn, nếu bạn có thể hoặc không thể tránh giới hạn này, tôi không chắc chắn. "Công nhân (như những kịch bản nền được gọi ở đây) là tương đối nặng trọng lượng, và không có ý định được sử dụng với số lượng lớn." Bạn có thể đưa ra một tình huống chính xác nơi bạn muốn sử dụng hơn 20 công nhân không? - Marius Balaban Nov 26 '12 at 22:34

Các vấn đề liên quan