2012-08-28 25 views
11

Cụ thể nói về (phía máy chủ) V8 và giả sử tôi không quan tâm đến độ chính xác vì tôi có thể phát hiện và bù đắp cho nó, tôi có thể theo nghĩa đen thiết lập hàng nghìn thời gian chờ tương đối đơn giản cách nhau một vài giây bằng cách sử dụng setTimeout phải đối mặt với bất kỳ giới hạn nào khác ngoài RAM? Có bất kỳ bắt nào tôi nên biết nếu tôi sử dụng một hệ thống có thể có hàng nghìn thời gian chờ được lên lịch vào bất kỳ thời điểm nào?Có giới hạn nào đối với setTimeout không?

Đối với bản ghi tôi đã đọc bài viết xuất sắc của John's Resig trên How Javascript Timers work vì vậy không cần phải chỉ ra bất cứ điều gì đã được đề cập ở đó :) Tôi biết node.js là đơn luồng, bộ hẹn giờ có thể chặn các bộ hẹn giờ khác dài, vv

PS: Tôi đang cố gắng hiểu rõ mức độ hữu hiệu của những gì tôi mô tả, không cần phải chỉ ra "chắc chắn có cách tốt hơn để làm những gì bạn định làm!".

+5

có là bảo đảm một cách tốt hơn để làm những gì bạn có ý định làm! – jAndy

+2

Thiết lập một vài triệu thời gian chờ chỉ là một vòng lặp 'for'. Hãy thử nó và cho chúng tôi biết. ;) – Jon

+0

@Jon Tôi đã thử điều này bởi vì tôi cũng đã tự hỏi và tôi tin rằng nó không phải là đắt ... – Alfred

Trả lời

11

Giới hạn thực tế duy nhất mà bạn có thể gặp phải là lượng bộ nhớ có sẵn cho nút. Sử dụng mã sau để kiểm tra. Tôi đã chạy thành công ví dụ dưới đây bằng cách sử dụng một triệu và int32Max. Khi sử dụng int64Max, tôi nhận được lỗi sau từ nút. Tôi đang sử dụng các cửa sổ 64bit với 4GB RAM. đang

FATAL ERROR: CALL_AND_RETRY_2 Allocation failed - process out of memory 

Node để kiểm tra:

var util = require('util'); 
var int64Max = 9007199254740992; 
var int32Max = 2147483647; 
var oneMillion = 1000000; 
var tenThousand = 10000; 
var counter = 0; 

//Exchange the limiter with one of the above vars to test. 
for (var i = 0; i < oneMillion; i++){ 
    setTimeout(log, 1); 
    //Required as the timeout/callback method will not be called until the loop ends due 
    //to node/js being single threaded. 
    util.log('loop:' + i); 
} 

function log(){ 
    util.log('callback: ' + counter++); 
} 
+0

Số Javascript có 53 bit của mantissa, vì vậy một khi nó đạt khoảng 2^53, tăng không còn hoạt động, nó viên đạn đến cùng một số mà không gây ra bất kỳ thay đổi nào. Nghi ngờ điều đó? Hãy thử 'Math.pow (2,53)' và 'Math.pow (2,53) + 1' trong bảng điều khiển trình gỡ lỗi. Tại sao 'int64Max' được đề cập ở tất cả? – doug65536

1

Tôi không biết nút hoạt động như thế nào, nhưng nếu bạn tạo MAXINT + 1 bộ hẹn giờ mà không cho phép chúng chạy, bạn có nguy cơ bị tràn số nguyên.

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