2013-07-25 28 views
111

này có vẻ giống như một câu hỏi cơ bản, nhưng tôi không thể tìm thấy bất kỳ tài liệu:Node.js child process - sự khác biệt giữa spawn & nĩa

sự khác biệt giữa forking & đẻ trứng một quá trình Node.js là gì? Tôi đã đọc rằng forking là một trường hợp đặc biệt của sinh sản, nhưng các trường hợp sử dụng khác nhau/repecussions để sử dụng mỗi người trong số họ là gì?

Trả lời

165

Spawn là lệnh được thiết kế để chạy các lệnh hệ thống. Khi bạn chạy đẻ trứng, bạn gửi cho nó một lệnh hệ thống sẽ được chạy trên tiến trình riêng của nó, nhưng không thực thi bất kỳ mã nào khác trong tiến trình nút của bạn. Bạn có thể thêm người nghe cho quá trình bạn đã sinh ra, cho phép mã của bạn tương tác với quá trình sinh sản, nhưng không có phiên bản V8 mới nào được tạo ra (trừ khi lệnh của bạn là một lệnh Node khác, nhưng trong trường hợp này bạn nên sử dụng fork!) Và chỉ có một bản sao của mô-đun nút của bạn đang hoạt động trên bộ xử lý.

Ngã ba là một ví dụ đặc biệt về đẻ trứng, chạy một phiên bản mới của động cơ V8. Nghĩa là, về cơ bản bạn có thể tạo nhiều công nhân, chạy trên cùng một cơ sở mã Node giống nhau, hoặc có lẽ là một mô-đun khác cho một nhiệm vụ cụ thể. Điều này hữu ích nhất khi tạo một nhóm công nhân. Trong khi mô hình sự kiện nút async cho phép một lõi đơn lẻ của máy được sử dụng khá hiệu quả, nó không cho phép một quy trình nút sử dụng các máy đa lõi. Cách dễ nhất để thực hiện việc này là chạy nhiều bản sao của cùng một chương trình, trên một bộ xử lý duy nhất. Một quy tắc tốt là một đến hai quy trình nút trên mỗi lõi, có lẽ nhiều hơn cho các máy có tỷ lệ đồng hồ ram/CPU tốt, hoặc cho các quá trình nút nặng trên I/O và ánh sáng trên CPU, để giảm thiểu xuống thời gian vòng lặp sự kiện đang chờ các sự kiện mới. Tuy nhiên, gợi ý thứ hai là một tối ưu hóa vi mô, và sẽ cần điểm chuẩn cẩn thận để đảm bảo tình hình của bạn phù hợp với nhu cầu của nhiều quá trình/lõi. Bạn thực sự có thể giảm hiệu suất bằng cách sinh ra quá nhiều công nhân cho máy/kịch bản của bạn.

Cuối cùng bạn có thể sử dụng đẻ trứng theo cách đã thực hiện ở trên, bằng cách gửi phát sinh lệnh Node. Nhưng điều này sẽ là ngớ ngẩn, bởi vì ngã ba làm một số điều để tối ưu hóa quá trình tạo ra các trường hợp V8. Chỉ cần làm cho nó rõ ràng, mà cuối cùng đẻ trứng bao gồm ngã ba. Fork chỉ là tối ưu cho trường hợp sử dụng đặc biệt và rất hữu ích này.

http://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback

+0

Cảm ơn @ChrisCM, mà xóa @ChrisCM nghi ngờ – Hitesh

+0

của tôi, nếu tôi sử dụng chúng ta hãy nói 'var child = require ('child_process') fork ('child.js');. 'Ví dụ trên của tôi ứng dụng chính, bây giờ tôi sẽ có 2 lõi riêng biệt chạy. Nếu tôi đã chạy một ** nặng ** cho vòng lặp trong child.js (quá trình), về cơ bản tôi sẽ sử dụng nhiều lõi hơn để cấp nguồn cho child.js, đúng không? Liệu việc sử dụng cpu đó có ảnh hưởng đến lõi ứng dụng chính của tôi không? –

+2

Không thể làm bất cứ điều gì trên CPU mà không ảnh hưởng đến những thứ khác. Lập lịch, sử dụng bộ nhớ cache dùng chung, lưu lượng BUS, v.v. Tuy nhiên, nó nên tận dụng lợi thế của một lõi riêng biệt và để lại vòng chạy chính của bạn KHÔNG bị ảnh hưởng nghiêm trọng. Như trong, không phải các hiệu ứng tiêu cực nghiêm trọng mà bạn mong đợi có hai quy trình chạy trên cùng một bộ xử lý lõi đơn. Tại thời điểm này, nó thực sự là hệ điều hành và thiết lập phần cứng để tối ưu hóa đúng cách. Các thiết lập khác nhau có thể mang lại các kết quả khác nhau. – ChrisCM

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