Phản hồi của Haskell đối với Node.js là gì?


217

Tôi tin rằng cộng đồng Erlang không ghen tị với Node.js vì nó không chặn I / O nguyên bản và có các cách để mở rộng quy mô triển khai dễ dàng đến nhiều bộ xử lý (một thứ thậm chí không được tích hợp trong Node.js). Thêm chi tiết tại http://journal.dedasys.com/2010/04/29/erlang-vs-node-jsNode.js hoặc Erlang

Haskell thì sao? Haskell có thể cung cấp một số lợi ích của Node.js, cụ thể là một giải pháp sạch để tránh chặn I / O mà không cần phải lập trình đa luồng không?


Có nhiều điều hấp dẫn với Node.js

  1. Sự kiện: Không có thao tác xử lý luồng, lập trình viên chỉ cung cấp các cuộc gọi lại (như trong khung Snap)
  2. Các cuộc gọi lại được đảm bảo để chạy trong một luồng duy nhất: không có điều kiện cuộc đua nào có thể.
  3. API thân thiện với UNIX đơn giản và đẹp. Tiền thưởng: Hỗ trợ HTTP tuyệt vời. DNS cũng có sẵn.
  4. Mỗi I / O theo mặc định là không đồng bộ. Điều này làm cho nó dễ dàng hơn để tránh ổ khóa. Tuy nhiên, quá nhiều CPU xử lý trong một cuộc gọi lại sẽ ảnh hưởng đến các kết nối khác (trong trường hợp này, tác vụ sẽ được chia thành các tác vụ phụ nhỏ hơn và được lên lịch lại).
  5. Cùng một ngôn ngữ cho phía máy khách và phía máy chủ. (Tuy nhiên, tôi không thấy quá nhiều giá trị trong cái này. JQuery và Node.js chia sẻ mô hình lập trình sự kiện nhưng phần còn lại thì rất khác. Tôi không thể thấy cách chia sẻ mã giữa phía máy chủ và phía máy khách có thể có ích trong thực tế.)
  6. Tất cả điều này được đóng gói trong một sản phẩm duy nhất.

17
Tôi nghĩ bạn nên đặt câu hỏi này trên Lập trình viên thay thế.
Jonas

47
Không bao gồm một đoạn mã không làm cho nó trở thành một câu hỏi chủ quan.
gawi

20
Tôi không biết nhiều về node.js, nhưng có một điều khiến tôi thắc mắc về câu hỏi của bạn: tại sao bạn lại thấy triển vọng của các chủ đề rất khó chịu? Chủ đề phải chính xác là giải pháp phù hợp để ghép kênh I / O. Tôi sử dụng các chủ đề hạn rộng rãi ở đây, bao gồm các quy trình của Erlang. Có lẽ bạn đang lo lắng về ổ khóa và trạng thái đột biến? Bạn không phải thực hiện theo cách đó - sử dụng chuyển tin nhắn hoặc giao dịch nếu điều đó có ý nghĩa hơn cho ứng dụng của bạn.
Simon Marlow

9
@gawi Tôi không nghĩ rằng chương trình nghe có vẻ rất dễ dàng - không có sự miễn trừ trước, bạn phải đối phó với khả năng chết đói và thời gian trễ dài. Về cơ bản các luồng là sự trừu tượng đúng cho một máy chủ web - không cần phải xử lý I / O không đồng bộ và tất cả những khó khăn đi kèm với điều đó, chỉ cần thực hiện trong một luồng. Tình cờ, tôi đã viết một bài báo về các máy chủ web ở Haskell mà bạn có thể thấy thú vị: haskell.org/~simonmar/ con / web
Simon Marlow

3
"Các cuộc gọi lại được đảm bảo để chạy trong một chuỗi duy nhất: không có điều kiện cuộc đua nào có thể." Sai lầm. Bạn có thể dễ dàng có các điều kiện chủng tộc trong Node.js; chỉ cần giả định rằng một hành động I / O sẽ hoàn thành trước một hành động khác và BÙM. Có gì thực sự không thể là một loại đặc biệt của điều kiện chủng tộc, cụ thể là đồng thời truy cập không đều đặn đến byte cùng trong bộ nhớ.
đúng vào

Câu trả lời:


219

Ok, vì vậy đã xem một chút về bản trình bày của node.js mà @gawi chỉ cho tôi, tôi có thể nói thêm một chút về cách Haskell so sánh với node.js. Trong bài trình bày, Ryan mô tả một số lợi ích của Chủ đề xanh, nhưng sau đó tiếp tục nói rằng anh ta không thấy việc thiếu một chủ đề trừu tượng là một bất lợi. Tôi không đồng ý với vị trí của anh ấy, đặc biệt là trong bối cảnh của Haskell: Tôi nghĩ rằng sự trừu tượng mà các luồng cung cấp là rất cần thiết để làm cho mã máy chủ dễ dàng hơn để có được quyền và mạnh mẽ hơn. Đặc biệt:

  • sử dụng một luồng trên mỗi kết nối cho phép bạn viết mã thể hiện giao tiếp với một máy khách, thay vì viết mã đó liên quan đến tất cả các máy khách cùng một lúc. Hãy nghĩ về nó như thế này: một máy chủ xử lý nhiều máy khách với các luồng trông gần giống như một máy chủ xử lý một máy khách; sự khác biệt chính là có một forknơi nào đó trước đây. Nếu giao thức bạn đang thực hiện hoàn toàn phức tạp, việc quản lý máy trạng thái cho nhiều máy khách đồng thời khá khó khăn, trong khi các luồng cho phép bạn chỉ cần kịch bản giao tiếp với một máy khách. Mã dễ dàng hơn để có được quyền, và dễ hiểu và bảo trì hơn.

  • cuộc gọi lại trên một luồng hệ điều hành duy nhất là đa nhiệm hợp tác, trái ngược với đa nhiệm được ưu tiên, đó là những gì bạn nhận được với các luồng. Nhược điểm chính với đa nhiệm hợp tác là lập trình viên chịu trách nhiệm đảm bảo rằng không có nạn đói. Nó mất tính mô-đun: mắc lỗi ở một nơi và có thể làm hỏng cả hệ thống. Đây thực sự là điều bạn không muốn phải lo lắng, và sự ưu tiên là giải pháp đơn giản. Hơn nữa, giao tiếp giữa các cuộc gọi lại là không thể (nó sẽ bế tắc).

  • đồng thời không khó trong Haskell, bởi vì hầu hết các mã là thuần túy và do đó an toàn cho luồng khi xây dựng. Có những nguyên thủy giao tiếp đơn giản. Việc tự bắn vào chân mình bằng Haskell khó hơn nhiều so với ngôn ngữ có tác dụng phụ không hạn chế.


42
Ok, vì vậy tôi hiểu rằng node.js là giải pháp cho 2 vấn đề: 1- đồng thời là khó khăn trong hầu hết các ngôn ngữ, 2- sử dụng các luồng hệ điều hành là mở rộng. Giải pháp của Node.js là sử dụng đồng thời dựa trên sự kiện (w / libev) để tránh giao tiếp giữa các luồng và để tránh các vấn đề về khả năng mở rộng của các luồng hệ điều hành. Haskell không có vấn đề # 1 vì độ tinh khiết. Đối với # 2, Haskell có các chủ đề nhẹ + trình quản lý sự kiện được tối ưu hóa gần đây trong GHC cho các bối cảnh quy mô lớn. Ngoài ra, sử dụng Javascript không thể được coi là một điểm cộng cho bất kỳ nhà phát triển Haskell nào. Đối với một số người sử dụng Snap Framework, Node.js là "chỉ xấu".
gawi

4
Yêu cầu xử lý hầu hết thời gian là một chuỗi các hoạt động phụ thuộc lẫn nhau. Tôi có xu hướng đồng ý rằng việc sử dụng các cuộc gọi lại cho mọi hoạt động chặn có thể là cồng kềnh. Chủ đề phù hợp hơn so với gọi lại cho điều này.
gawi

10
Vâng! Và ghép kênh I / O hoàn toàn mới trong GHC 7 làm cho máy chủ viết trong Haskell thậm chí còn tốt hơn.
andreypopp

3
Điểm đầu tiên của bạn không có ý nghĩa nhiều đối với tôi (với tư cách là người ngoài cuộc) ... Khi xử lý một yêu cầu trong node.js, cuộc gọi lại của bạn giao dịch với một khách hàng. Việc quản lý trạng thái chỉ trở thành một điều đáng lo ngại khi nhân rộng ra nhiều quy trình và thậm chí sau đó việc sử dụng các thư viện có sẵn khá dễ dàng.
Ricardo Tomasi

12
Đây không phải là một vấn đề riêng biệt. Nếu câu hỏi này là tìm kiếm chính xác các công cụ tốt nhất cho công việc trong Haskell hoặc kiểm tra xem các công cụ tuyệt vời cho công việc có tồn tại trong Haskell hay không, thì giả định ngầm định rằng lập trình đa luồng sẽ không cần phải thử thách, bởi vì Haskell không chủ đề khá khác nhau, như Don Stewart chỉ ra. Các câu trả lời giải thích lý do tại sao cộng đồng Haskell cũng không ghen tị với Node.js có rất nhiều chủ đề cho câu hỏi này. Câu trả lời của gawi cho thấy đó là một câu trả lời thích hợp cho câu hỏi của anh ấy.
AndrewC

154

Haskell có thể cung cấp một số lợi ích của Node.js, cụ thể là một giải pháp sạch để tránh chặn I / O mà không cần phải lập trình đa luồng không?

Vâng, trong thực tế các sự kiện và chủ đề được thống nhất trong Haskell.

  • Bạn có thể lập trình trong các luồng nhẹ rõ ràng (ví dụ: hàng triệu luồng trên một máy tính xách tay).
  • Hoặc là; bạn có thể lập trình theo kiểu điều khiển sự kiện không đồng bộ, dựa trên thông báo sự kiện có thể mở rộng.

Các luồng thực sự được triển khai theo các sự kiện và chạy trên nhiều lõi, với việc di chuyển luồng liền mạch, với hiệu suất được ghi lại và các ứng dụng.

Ví dụ cho

Bộ sưu tập đồng thời nbody trên 32 lõi

văn bản thay thế

Trong Haskell bạn có cả sự kiện và chủ đề, và vì đó là tất cả các sự kiện dưới mui xe.

Đọc bài viết mô tả việc thực hiện.


2
Cảm ơn. Tôi cần phải tiêu hóa tất cả những điều này ... Điều này dường như là dành riêng cho GHC. Tôi đoán nó ổn. Ngôn ngữ Haskell đôi khi là bất cứ thứ gì GHC có thể biên dịch. Theo cách tương tự, "nền tảng" Haskell ít nhiều là thời gian chạy GHC.
gawi

1
@gawi: Đó và tất cả các gói khác được gói ngay vào đó để nó hữu ích ngay lập tức. Và đây là hình ảnh giống như tôi đã thấy trong khóa học CS của mình; và phần tốt nhất là không khó để Haskell đạt được kết quả tuyệt vời tương tự trong các chương trình của riêng bạn.
Robert Massaioli

1
Xin chào Don, bạn có nghĩ rằng bạn có thể liên kết với máy chủ web haskell hoạt động tốt nhất (Warp) khi trả lời các câu hỏi như thế này không? Đây là điểm chuẩn khá phù hợp so với Node.js: yesodweb.com/blog/2011/03/ Kẻ
Greg Weber

4
Chỉ trong lý thuyết. Haskell "chủ đề nhẹ" không quá nhẹ như bạn nghĩ. Việc đăng ký một cuộc gọi lại trên giao diện epoll rẻ hơn rất nhiều so với việc lên lịch cho một luồng được gọi là luồng xanh, tất nhiên chúng rẻ hơn so với các luồng của hệ điều hành nhưng chúng không miễn phí. Tạo 100.000 trong số họ sử dụng khoảng. Bộ nhớ 350 MB và mất một chút thời gian. Hãy thử 100.000 kết nối với node.js. Không có vấn đề gì cả . Sẽ là kỳ diệu nếu nó không nhanh hơn vì ghc sử dụng epoll dưới mui xe để chúng không thể nhanh hơn sử dụng epoll trực tiếp. Các chương trình với giao diện chủ đề là khá tốt, mặc dù.
Kr0e

3
Ngoài ra: Trình quản lý IO mới (ghc) sử dụng thuật toán lập lịch có độ phức tạp (m log n) (trong đó m là số lượng luồng có thể chạy được và n tổng số luồng). Epoll có độ phức tạp k (k là số fd'sable có thể đọc / ghi được =. Vì vậy, ghc có O (k * m log n) trên tất cả độ phức tạp, điều này không tốt lắm nếu bạn phải đối mặt với các kết nối lưu lượng truy cập cao. Node.js chỉ gây ra sự phức tạp tuyến tính. bởi epoll. Và chúng ta đừng nói về hiệu suất của windows ... Node.js nhanh hơn nhiều vì nó sử dụng IOCP.
Kr0e

20

Trước tiên, tôi không giữ quan điểm của bạn rằng node.js đang thực hiện đúng cách phơi bày tất cả các cuộc gọi lại đó. Cuối cùng, bạn viết chương trình của mình theo CPS (kiểu tiếp tục truyền) và tôi nghĩ rằng đó là công việc của nhà soạn nhạc để thực hiện chuyển đổi đó.

Sự kiện: Không có thao tác xử lý luồng, lập trình viên chỉ cung cấp các cuộc gọi lại (như trong khung Snap)

Vì vậy, với suy nghĩ này, bạn có thể viết bằng cách sử dụng kiểu không đồng bộ nếu bạn muốn, nhưng bằng cách đó, bạn sẽ bỏ lỡ việc viết theo kiểu đồng bộ hiệu quả, với một luồng cho mỗi yêu cầu. Haskell rất hiệu quả ở mã đồng bộ, đặc biệt khi so sánh với các ngôn ngữ khác. Đó là tất cả các sự kiện bên dưới.

Các cuộc gọi lại được đảm bảo để chạy trong một luồng duy nhất: không có điều kiện cuộc đua nào có thể.

Bạn vẫn có thể có một điều kiện cuộc đua trong node.js, nhưng điều đó khó khăn hơn.

Mỗi yêu cầu là trong chủ đề riêng của nó. Khi bạn viết mã phải giao tiếp với các luồng khác, sẽ rất đơn giản để làm cho nó an toàn nhờ các nguyên hàm đồng thời của haskell.

API thân thiện với UNIX đơn giản và đẹp. Tiền thưởng: Hỗ trợ HTTP tuyệt vời. DNS cũng có sẵn.

Hãy xem trong hackage và xem cho chính mình.

Mọi I / O theo mặc định là không đồng bộ (mặc dù điều này đôi khi có thể gây khó chịu). Điều này làm cho nó dễ dàng hơn để tránh ổ khóa. Tuy nhiên, quá nhiều CPU xử lý trong một cuộc gọi lại sẽ ảnh hưởng đến các kết nối khác (trong trường hợp này, tác vụ sẽ được chia thành các tác vụ phụ nhỏ hơn và được lên lịch lại).

Bạn không có vấn đề như vậy, ghc sẽ phân phối công việc của bạn giữa các luồng hệ điều hành thực.

Cùng một ngôn ngữ cho phía máy khách và phía máy chủ. (Tuy nhiên, tôi không thấy quá nhiều giá trị trong cái này. Tuy nhiên, JQuery và Node.js chia sẻ mô hình lập trình sự kiện nhưng phần còn lại thì rất khác. Tôi không thể thấy cách chia sẻ mã giữa phía máy chủ và phía máy khách có thể có ích trong thực tế.)

Haskell không thể chiến thắng ở đây ... phải không? Hãy suy nghĩ lại, http://www.haskell.org/haskellwiki/Haskell_in_web_browser .

Tất cả điều này được đóng gói trong một sản phẩm duy nhất.

Tải ghc, cháy lên cabal. Có một gói cho mọi nhu cầu.


Tôi chỉ đang chơi người ủng hộ của quỷ. Vì vậy, vâng tôi đồng ý về quan điểm của bạn. Ngoại trừ thống nhất ngôn ngữ phía máy khách và phía máy chủ. Mặc dù tôi nghĩ rằng nó khả thi về mặt kỹ thuật, tôi không nghĩ rằng cuối cùng nó có thể thay thế tất cả hệ sinh thái Javascript tại chỗ (JQuery và bạn bè). Mặc dù đó là một cuộc tranh luận được đưa ra bởi những người ủng hộ Node.js, tôi không nghĩ đó là một cuộc tranh luận rất quan trọng. Bạn có thực sự cần chia sẻ nhiều mã đó giữa lớp trình bày và phần phụ trợ của bạn không? Chúng ta có thực sự nhắm đến việc các lập trình viên chỉ biết một ngôn ngữ không?
gawi

Chiến thắng thực sự là bạn có thể kết xuất các trang trên cả phía máy chủ và máy khách để tạo các trang thời gian thực dễ dàng hơn để tạo.
dan_waterworth

@dan_waterworth chính xác, xem sao băng hoặc derby.js
mb21

1
@gawi Chúng tôi có các dịch vụ sản xuất trong đó 85% mã được chia sẻ giữa máy khách và máy chủ. Điều này được gọi là JavaScript phổ quát trong cộng đồng. Chúng tôi đang sử dụng React để tự động kết xuất nội dung trên máy chủ để giảm thời gian kết xuất hữu ích đầu tiên trong máy khách. Mặc dù tôi biết rằng bạn có thể chạy Haskell trong trình duyệt, nhưng tôi không biết về bất kỳ tập hợp "Haskell phổ quát" nào cho phép hiển thị phía máy chủ và phía máy khách bằng cách sử dụng cùng một cơ sở mã.
Eric Elliott

8

Cá nhân tôi thấy Node.js và lập trình với các cuộc gọi lại là mức độ thấp không cần thiết và một chút không tự nhiên. Tại sao chương trình với các cuộc gọi lại khi một thời gian chạy tốt như chương trình được tìm thấy trong GHC có thể xử lý các cuộc gọi lại cho bạn và thực hiện khá hiệu quả?

Trong khi đó, thời gian chạy GHC đã được cải thiện rất nhiều: giờ đây nó có "trình quản lý IO mới" được gọi là MIO trong đó "M" là viết tắt của đa lõi tôi tin. Nó xây dựng trên nền tảng của trình quản lý IO hiện tại và mục tiêu chính của nó là khắc phục nguyên nhân suy giảm hiệu năng của hơn 4 lõi. Con số hiệu suất được cung cấp trong bài báo này là khá ấn tượng. Tự mình trông thấy:

Với Mio, các máy chủ HTTP thực tế ở quy mô Haskell có tới 20 lõi CPU, đạt hiệu suất cao nhất tới 6,5 lần so với các máy chủ tương tự sử dụng các phiên bản GHC trước đó. Độ trễ của máy chủ Haskell cũng được cải thiện: [...] trong một mức tải vừa phải, giảm thời gian phản hồi dự kiến ​​5,7 lần khi so sánh với các phiên bản GHC trước đây

Và:

Chúng tôi cũng chỉ ra rằng với Mio, McNantara (bộ điều khiển SDN được viết bằng Haskell) có thể mở rộng hiệu quả tới hơn 40 lõi, đạt được hơn 20 triệu yêu cầu mới mỗi giây trên một máy và do đó trở thành nhanh nhất trong tất cả các bộ điều khiển SDN hiện có .

Mio đã đưa nó vào bản phát hành GHC 7.8.1. Cá nhân tôi thấy đây là một bước tiến lớn trong hiệu suất của Haskell. Sẽ rất thú vị khi so sánh hiệu suất ứng dụng web hiện có được biên dịch bởi phiên bản GHC trước đó và 7.8.1.


6

Sự kiện IMHO là tốt, nhưng lập trình bằng phương thức gọi lại thì không.

Hầu hết các vấn đề làm cho việc mã hóa và gỡ lỗi của các ứng dụng web trở nên đặc biệt đến từ những gì làm cho chúng có thể mở rộng và khả thi. Điều quan trọng nhất, bản chất không trạng thái của HTTP. Điều này giúp tăng khả năng điều hướng, nhưng điều này đặt ra sự đảo ngược của điều khiển trong đó phần tử IO (máy chủ web trong trường hợp này) gọi các trình xử lý khác nhau trong mã ứng dụng. Mô hình sự kiện này - hay mô hình gọi lại, nói chính xác hơn - là một cơn ác mộng, vì các cuộc gọi lại không chia sẻ phạm vi biến đổi và một cái nhìn trực quan về điều hướng bị mất. Rất khó để ngăn chặn tất cả các thay đổi trạng thái có thể xảy ra khi người dùng điều hướng qua lại, trong số các vấn đề khác.

Có thể nói rằng các vấn đề tương tự như lập trình GUI trong đó mô hình sự kiện hoạt động tốt, nhưng GUI không có điều hướng và không có nút quay lại. Điều đó nhân lên các chuyển đổi trạng thái có thể có trong các ứng dụng web. Kết quả của nỗ lực giải quyết các vấn đề này là các khung nặng với cấu hình phức tạp, nhiều định danh ma thuật phổ biến mà không đặt câu hỏi về gốc rễ của vấn đề: mô hình gọi lại và thiếu chia sẻ phạm vi biến đổi và không có trình tự, do đó trình tự phải được xây dựng bằng cách liên kết định danh.

Có các khung dựa trên tuần tự như ocsigen (ocaml) bên bờ biển (smalltalk) WASH (ngưng, Haskell) và mflow (Haskell) giải quyết vấn đề quản lý nhà nước trong khi duy trì khả năng điều hướng và tính ưu việt của REST. trong các khung này, lập trình viên có thể biểu thị điều hướng như một chuỗi bắt buộc trong đó chương trình gửi các trang và chờ phản hồi trong một luồng, các biến nằm trong phạm vi và nút quay lại hoạt động tự động. Điều này vốn đã tạo ra mã ngắn hơn, an toàn hơn, dễ đọc hơn trong đó điều hướng được hiển thị rõ ràng cho người lập trình. (cảnh báo công bằng: Tôi là nhà phát triển của mflow)


Trong các cuộc gọi lại của node.js được sử dụng để xử lý I / O không đồng bộ, ví dụ như đối với cơ sở dữ liệu. Bạn đang nói về một cái gì đó khác nhau, trong khi thú vị, không trả lời câu hỏi.
Robin Green

Bạn đúng rồi. Phải mất ba năm để có câu trả lời rằng, tôi hy vọng, đáp ứng sự phản đối của bạn: github.com/transient-haskell
agocorona

Node hiện hỗ trợ các hàm async, có nghĩa là bạn có thể viết mã kiểu bắt buộc thực sự không đồng bộ. Nó sử dụng lời hứa dưới mui xe.
Eric Elliott

5

Câu hỏi khá vô lý vì 1) Haskell đã giải quyết vấn đề này theo cách tốt hơn nhiều và 2) gần giống như cách mà Erlang có. Đây là điểm chuẩn so với nút: http://www.yesodweb.com/blog/2011/03/prinating-warp-cross-lingu-benchmark

Cung cấp cho Haskell 4 lõi và nó có thể thực hiện 100k yêu cầu (đơn giản) mỗi giây trong một ứng dụng. Nút không thể làm nhiều như vậy và không thể mở rộng một ứng dụng trên các lõi. Và bạn không phải làm bất cứ điều gì để gặt hái điều này bởi vì thời gian chạy Haskell là không chặn. Ngôn ngữ duy nhất (tương đối phổ biến) có IO không chặn được tích hợp trong thời gian chạy là Erlang.


14
Nực cười? Câu hỏi không phải là "Haskell có phản hồi không" mà là "phản hồi của Haskell là gì". Tại thời điểm câu hỏi được đặt ra, GHC 7 thậm chí chưa được phát hành nên Haskell chưa "trong trò chơi" (ngoại trừ các khung sử dụng libev như Snap). Ngoài ra, tôi đồng ý.
gawi

1
Tôi không biết điều này có đúng không khi bạn đăng câu trả lời này, nhưng trên thực tế, có các mô-đun nút cho phép các ứng dụng nút dễ dàng mở rộng quy mô trên các lõi. Ngoài ra, liên kết đó đang so sánh node.js chạy trên một lõi đơn với haskell chạy trên 4 lõi. Tôi muốn thấy nó chạy lại trong một cấu hình công bằng hơn, nhưng than ôi, repo github đã biến mất.
Tim Gautier

2
Haskell sử dụng hơn 4 lõi làm giảm hiệu suất của ứng dụng. Có một bài viết về vấn đề này, nó đã tích cực làm việc nhưng nó vẫn là một vấn đề. Vì vậy, việc chạy 16 phiên bản Node.js trên máy chủ 16 lõi rất có thể sẽ tốt hơn nhiều so với một ứng dụng ghc duy nhất sử dụng + RTS -N16, thực sự sẽ chậm hơn + RTS -N1 vì lỗi thời gian chạy này. Đó là bởi vì họ chỉ sử dụng một IOManager, nó sẽ chậm lại khi được sử dụng với nhiều luồng hệ điều hành. Tôi hy vọng họ sẽ sửa lỗi này nhưng nó tồn tại từ bao giờ nên tôi sẽ không có nhiều hy vọng ...
Kr0e

Bất cứ ai nhìn vào câu trả lời này đều phải biết rằng Node có thể dễ dàng xử lý 100 nghìn yêu cầu đơn giản trên một lõi và thật dễ dàng để mở rộng ứng dụng Node không trạng thái trên nhiều lõi. pm2 -i max path/to/app.jssẽ tự động chia tỷ lệ theo số trường hợp tối ưu dựa trên các lõi có sẵn. Ngoài ra, Node cũng không chặn theo mặc định.
Eric Elliott

1

1
Làm thế nào để trả lời câu hỏi này?
dfeuer

1
@dfeuer Liên kết phải đọc là, Snap Haskell Web Framework đã bỏ libev, tôi không biết tại sao định dạng lại thất bại. Thời gian chạy máy chủ nút là tất cả về Linux libev khi nó bắt đầu, và Snap Web FrameWork cũng vậy. Haskell với Snap giống như ECMAscript với nodejs, vì vậy cách Snap phát triển cùng với nodejs có liên quan hơn Haskell, điều đó có thể đúng hơn so với ECMAscript trong ngữ cảnh này.
Chawedit Vipul S
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.