2011-11-13 26 views
5

Về mặt kỹ thuật khi chúng tôi thực thi mã sau đây (quá trình đệ quy.nexttick), việc sử dụng CPU sẽ đạt đến 100% hoặc gần. Câu hỏi đặt ra là tưởng tượng rằng tôi đang chạy trên một máy tính với một CPU và có một quá trình khác của máy chủ HTTP nút làm việc, nó ảnh hưởng như thế nào đến nó?Sử dụng quá trình đệ quy.nexttick có cho phép các quy trình hoặc luồng khác hoạt động không?

Chủ đề có đang thực hiện quy trình đệ quy.nexttick để máy chủ HTTP hoạt động không?

Nếu chúng tôi có hai luồng của process.nexttick đệ quy, cả hai có nhận được 50% chia sẻ không?

Vì tôi không biết bất kỳ máy nào có một lõi không thể dùng thử. Và kể từ khi sự hiểu biết của tôi về thời gian chia sẻ CPU giữa các chủ đề được giới hạn trong trường hợp này, tôi không làm thế nào nên thử nó với các máy có 4 lõi CPU.

function interval(){ 
    process.nextTick(function(){ 
    someSmallSyncCode(); 
    interval(); 
    }) 
} 

Cảm ơn

+0

Nút không có chủ đề. Bạn đang nói về các quy trình hoặc công cụ hoàn toàn riêng biệt xảy ra trong cùng một cá thể nút? – thejh

+0

Không, tôi đang nói về hai quy trình riêng biệt của nút, không phải là cùng một cá thể. –

+0

Đã chỉnh sửa, đã thay đổi chuỗi để xử lý. –

Trả lời

12

Để hiểu những gì đang xảy ra ở đây, bạn phải hiểu một vài điều về vòng lặp sự kiện của nút cũng như hệ điều hành và CPU.

Trước hết, hãy hiểu mã này tốt hơn. Bạn gọi nó là đệ quy, nhưng phải không?

Trong đệ quy, chúng ta thường nghĩ về ngăn xếp cuộc gọi lồng nhau và sau đó khi tính toán được thực hiện (đạt trường hợp cơ bản), ngăn xếp "thư giãn" trở lại điểm mà hàm đệ quy của chúng tôi được gọi.

Mặc dù đây là một phương thức tự gọi (gián tiếp thông qua một cuộc gọi lại), vòng lặp sự kiện nghiêng những gì đang thực sự xảy ra.

process.nextTick có chức năng gọi lại và đặt hàm đó đầu tiên trong danh sách các công việc cần thực hiện trên vòng lặp tiếp theo của vòng lặp sự kiện. Gọi lại này sau đó được thực thi và khi nó được thực hiện, bạn một lần nữa đăng ký cùng một cuộc gọi lại. Về cơ bản, sự khác biệt chính giữa đệ quy này và đệ quy thực sự là ngăn xếp cuộc gọi của chúng ta không bao giờ nhận được nhiều hơn một cuộc gọi sâu. Chúng tôi không bao giờ "thư giãn" các ngăn xếp, chúng tôi chỉ có rất nhiều ngăn xếp nhỏ nhỏ liên tiếp.

Được rồi, vậy tại sao điều này lại quan trọng?

Khi chúng tôi hiểu vòng lặp sự kiện tốt hơn và những gì đang thực sự diễn ra, chúng tôi có thể hiểu rõ hơn cách tài nguyên hệ thống được sử dụng. Bằng cách sử dụng process.nextTick trong thời trang này, bạn đang đảm bảo luôn luôn có một cái gì đó để làm trên vòng lặp sự kiện, đó là lý do tại sao bạn nhận được sử dụng cpu cao (nhưng bạn biết rằng đã có). Bây giờ, nếu chúng ta giả sử rằng máy chủ HTTP của bạn là để chạy trong quá trình tương tự như kịch bản, chẳng hạn như sau

function interval(){ 
    process.nextTick(doIntervalStuff) 
} 

function doIntervalStuff() { 
    someSmallSyncCode(); 
    interval(); 
} 

http.createServer(function (req, res) { 
doHTTPStuff() 
}).listen(1337, "127.0.0.1"); 

sau đó làm thế nào để sử dụng CPU được chia ra giữa hai bộ phận khác nhau của chương trình? Cũng thật khó để nói, nhưng nếu chúng ta hiểu vòng lặp sự kiện, chúng ta có thể đoán ít nhất.

Vì chúng tôi sử dụng process.nextTick, hàm doIntervalStuff sẽ chạy mỗi lần tại "bắt đầu" của vòng lặp sự kiện, tuy nhiên, nếu có điều gì đó được thực hiện cho máy chủ HTTP (như xử lý kết nối) thì chúng tôi biết rằng sẽ được thực hiện trước khi vòng lặp sự kiện bắt đầu, và hãy nhớ, do tính chất của nút đã xảy ra, điều này có thể xử lý bất kỳ số lượng kết nối nào trên một lần lặp của vòng lặp sự kiện.Điều này ngụ ý, ít nhất là về lý thuyết, mỗi chức năng trong quá trình nhận được những gì nó "cần" theo như cách sử dụng CPU, và sau đó các hàm process.nextTick sử dụng phần còn lại. Mặc dù điều này không đúng sự thật (ví dụ, bit chặn mã của bạn sẽ làm hỏng điều này), nhưng đó là một mô hình đủ tốt để suy nghĩ.

Đồng ý ngay bây giờ (cuối cùng) về câu hỏi thực sự của bạn, về các quy trình riêng biệt thì sao?

Điều thú vị đủ, hệ điều hành và CPU thường là thời gian cũng rất "có sự kiện" trong tự nhiên. Bất cứ khi nào một quy trình muốn làm điều gì đó (như trong trường hợp nút, bắt đầu lặp lại vòng lặp sự kiện), nó sẽ yêu cầu hệ điều hành được xử lý, hệ điều hành sẽ đẩy công việc này vào hàng đợi sẵn sàng (được ưu tiên) và nó thực thi khi bộ lập lịch CPU quyết định đi xung quanh nó. Đây là một mô hình đơn giản, nhưng khái niệm cốt lõi để loại bỏ là giống như trong vòng lặp sự kiện của nút, mỗi quá trình nhận được những gì nó cần và sau đó một quá trình như ứng dụng nút của bạn cố gắng thực hiện bất cứ khi nào có thể bằng cách điền vào khoảng trống.

Vì vậy, khi quy trình nút của bạn cho biết việc lấy 100% cpu, điều đó không chính xác, nếu không, không có gì khác sẽ được thực hiện và hệ thống sẽ bị lỗi. Về cơ bản, nó chiếm hết tất cả CPU, nhưng hệ điều hành vẫn xác định các thứ khác để trượt.

Nếu bạn thêm quy trình nút thứ hai thực hiện cùng một process.nextTick, hệ điều hành sẽ cố gắng chứa cả hai quy trình và, tùy thuộc vào số lượng công việc được thực hiện trên vòng lặp sự kiện của mỗi nút, hệ điều hành sẽ phân chia công việc tương ứng (ít nhất là về lý thuyết, nhưng trong thực tế có thể sẽ dẫn đến mọi thứ chậm lại và sự mất ổn định hệ thống).

Một lần nữa, điều này rất đơn giản, nhưng hy vọng nó cung cấp cho bạn ý tưởng về những gì đang diễn ra. Điều đó đang được nói, tôi sẽ không khuyên bạn nên sử dụng process.nextTick trừ khi bạn biết bạn cần nó, nếu làm một cái gì đó mỗi 5 ms là chấp nhận được, bằng cách sử dụng một setTimeout thay vì process.nextTick sẽ tiết kiệm oodles về sử dụng CPU.

Hy vọng câu trả lời cho câu hỏi của bạn: D

1

số Bạn không cần phải tạm dừng quá trình nhân tạo của mình để cho người khác làm công việc của họ, hệ điều hành của bạn có cơ chế cho điều đó. Trong thực tế, sử dụng process.nextTick theo cách này sẽ làm chậm máy tính của bạn xuống vì nó có rất nhiều chi phí.

+0

Nếu chúng ta có hai chủ đề của process.nexttick đệ quy, cả hai đều nhận được 50% chia sẻ? –

+0

@alFReDNSH: Của các lời gọi, nhưng không phải thời gian. – thejh

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