tiến trình con của node.js - sự khác biệt giữa sinh sản và ngã ba


141

Đây có vẻ như là 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 nào:

Sự khác biệt giữa việc giả mạo & sinh ra một quy trình node.js là gì? Tôi đã đọc đượ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 / lỗi khác nhau để sử dụng mỗi trường hợp là gì?

Câu trả lời:


215

Spawn là một lệnh được thiết kế để chạy các lệnh hệ thống. Khi bạn chạy sinh sản, 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 nữa trong quy trình nút của bạn. Bạn có thể thêm người nghe cho quy trình bạn đã sinh ra, để cho phép mã của bạn tương tác với quy trình được sinh ra, nhưng không có phiên bản V8 mới nào được tạo ra (trừ khi tất nhiên 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 được kích hoạt trên bộ xử lý.

Fork là một ví dụ đặc biệt của sinh sản, chạy một phiên bản mới của động cơ V8. Có 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 chính xác hoặc có thể là một mô-đun khác nhau cho một tác vụ cụ thể. Điều này là hữu ích nhất để tạo ra một nhóm công nhân. Mặc dù mô hình sự kiện không đồng bộ của nút cho phép một lõi của máy được sử dụng khá hiệu quả, nhưng nó không cho phép một quá trình nút sử dụng các máy đa lõi. Cách dễ nhất để thực hiện điều 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ý.

Một nguyên tắc nhỏ 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ệ xung nhịp / xung nhịp tốt hoặc cho các nút xử lý nặng trên I / O và làm việc nhẹ với CPU, để giảm thiểu thời gian xảy ra sự kiện vòng lặp đang chờ sự kiện mới. Tuy nhiên, đề xuất sau là tối ưu hóa vi mô và sẽ cần điểm chuẩn cẩn thận để đảm bảo tình huống của bạn phù hợp với nhu cầu của nhiều quy 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 sinh sản theo cách đã làm như trên, bằng cách gửi sinh sản một lệnh Node. Nhưng điều này sẽ là ngớ ngẩn, bởi vì fork thực hiện một số điều để tối ưu hóa quá trình tạo phiên bản V8. Chỉ cần làm cho nó rõ ràng, cuối cùng sinh sản bao gồm ngã ba. Fork chỉ là tối ưu cho trường hợp sử dụng cụ thể này và rất hữu ích.

http://nodejs.org/api/child_ process.html # child_ process_child_ process_exec_command_options_callback


@ChrisCM, nếu tôi sử dụng, var child = require('child_process').fork('child.js');ví dụ như trên ứng dụng chính của mình, bây giờ tôi sẽ có 2 lõi riêng biệt đang chạy. Nếu tôi chạy một vòng lặp for nặng trong child.js (process), về cơ bản tôi sẽ sử dụng nhiều lõi hơn để tăng sức mạnh cho child.js, phải không? Việc sử dụng cpu đó có ảnh hưởng đến lõi ứng dụng chính của tôi không?
NiCk Newman

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 được chia sẻ, lưu lượng BUS, v.v. Tuy nhiên, nó nên tận dụng một lõi riêng và để vòng lặp chạy chính của bạn KHÔNG bị ảnh hưởng. Như trong, không phải là các tác động tiêu cực nghiêm trọng mà bạn mong đợi khi có hai tiến 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ự phụ thuộc vào hệ điều hành và thiết lập phần cứng để tối ưu hóa đúng cách. Thiết lập khác nhau có thể mang lại kết quả khác nhau.
ChrisCM

@ChrisCM Vâng, tôi sử dụng MonsterLoop toàn cầu để đồng bộ hóa định vị quái vật và đối tượng mà nó lặp có thể có tới 5.000 phím. Tôi lặp đi lặp lại cứ sau 2 giây và cho rằng có vẻ như nó đã loại bỏ hàng trăm bộ nhớ sử dụng khỏi CPU của tôi (trò chơi chính). Tôi thà làm theo cách này thay vì phân cụm vòng lặp đó ra và làm cho nó chạy xx số lần trên mỗi lõi tôi đã ... Ty cho cái nhìn sâu sắc của bạn ~ Bây giờ tôi chỉ không biết liệu tôi nên sử dụng Redis hay IPC nội bộ: P
NiCk Newman

2
Cảm ơn bạn đã giải quyết "tại sao" - tất cả các bài đăng tôi đọc cho đến khi bài viết này bị bỏ lỡ phần giải thích đơn giản đó.
aaaaaa

@ChrisCM Trong câu trả lời của bạn "..nhưng không thực thi thêm bất kỳ mã nào trong quy trình nút của bạn ..". Điều đó có nghĩa là luồng chính đang chờ và không xử lý bất cứ điều gì..Nếu CÓ thì việc sử dụng sinh sản ở đây là gì ..?
Abhi

9

TLD

Spawn

Khi sinh sản được tạo - Nó tạo ra giao diện phát trực tuyến giữa tiến trình cha và con.

giao diện truyền phát có nghĩa là - đệm dữ liệu ở định dạng nhị phân trongONE TIME

Fork

Khi một ngã ba được tạo - Nó tạo ra một kênh giao tiếp giữa quá trình cha và con

phương tiện kênh truyền thông - nhắn tin

Difference

Cả hai đều trông giống như việc truyền dữ liệu , ngoại trừ sự khác biệt dưới đây

spawn sẽ hữu ích khi bạn muốn thực hiện bộ đệm dữ liệu liên tục ở định dạng nhị phân / mã hóa , Ví dụ: Chuyển tệp video 1gb, hình ảnh, tệp nhật ký trongONE TIME

ngã ba sẽ hữu ích khi bạn muốn nhắn tin Ví dụ - JSONhoặc XMLnhắn tin dữ liệu

Conslusion

spawn nên được sử dụng để truyền dữ liệu lớn / tập tin / hình ảnh TỪ quá trình sinh sản ĐẾN quá trình cha mẹ

ngã ba nên được sử dụng để thực hiện nhắn tin Json / Xml.

  • Ví dụ, giả sử 10 quá trình ngã ba được tạo ra từ cha mẹ.
  • và mỗi quá trình thực hiện một số thao tác
  • và mỗi quá trình hoàn thành thao tác sẽ gửi tin nhắn cho phụ huynh ' quy trình số 4 đã hoàn thành ', ' quy trình số 8 đã hoàn thành '

Điều gì về dữ liệu đăng nhập liên tục từ cha mẹ vào một đứa trẻ và cuối cùng trong một tập tin?
Esqarrouth

1
@Esqarrouth, bạn cần xác định xem đó sẽ là luồng hoặc tin nhắn liên tục. Và bạn đã dùng từ "liên tục loging" tôi tin u sẽ được wrting để log (JSON) cho con, Nếu có thì sử dụng FORKkhác nếu bạn có đoạn rất lớn của dữ liệu được đệm sau đó sử dụngSPAWN
vijay

5
  • spawn - child_ process.spawn khởi chạy một tiến trình mới với một lệnh đã cho.
  • fork - Phương thức child_ process.fork là trường hợp đặc biệt của spawn () để tạo các tiến trình con.

Phương thức sinh sản ()

Phương thức child_ process.spawn khởi chạy một tiến trình mới với một lệnh đã cho. Nó có chữ ký sau -

child_process.spawn(command[, args][, options])

Đọc thêm về các lựa chọn

Phương thức spawn () trả về các luồng (stdout & stderr) và nó nên được sử dụng khi quá trình trả về một khối lượng dữ liệu. spawn () bắt đầu nhận được phản hồi ngay khi quá trình bắt đầu thực thi.

Phương thức ngã ba ()

Phương thức child_ process.fork là trường hợp đặc biệt của spawn () để tạo các quy trình Node. Nó có chữ ký sau -

 child_process.fork(modulePath[, args][, options])

Phương thức fork trả về một đối tượng có kênh liên lạc tích hợp bên cạnh việc có tất cả các phương thức trong một thể hiện ChildProcess bình thường.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.