2010-05-29 24 views
26

Tôi không hiểu vấn đề này giải quyết được vấn đề gì. Có phải họ thay thế cho một máy chủ HTTP như Apache HTTPD, Tomcat, Mongrel, vv? Hay là họ nhiều hơn? Tại sao tôi có thể sử dụng chúng ... một số ví dụ thế giới thực? Tôi đã nhìn thấy các ví dụ vô tận của các phòng chat và các dịch vụ phát sóng, nhưng không thấy cách khác biệt này, ví dụ, thiết lập một chương trình Java để mở các ổ cắm và gửi một luồng cho mỗi yêu cầu.Điểm/mục đích của Ruby EventMachine, Python Twisted hoặc JavaScript Node.js là gì?

Tôi nghĩ rằng tôi hiểu I/O không chặn, nhưng tôi không hiểu nó khác gì so với máy chủ web đa luồng. Đối với Node.js tôi đọc nó chỉ có một chuỗi duy nhất, và điều này có thể hiệu quả hơn là tung hứng nhiều luồng, nhưng đó là sự khác biệt duy nhất giữa các khung công tác này và một máy chủ web truyền thống?

Trả lời

4

Không có ngăn xếp cho mỗi kết nối. Chỉ một ngăn xếp trên mỗi lõi bộ vi xử lý. Nó không giống như nó thực sự có thể làm nhiều hơn một điều tại một thời điểm - tại sao không chờ đợi cho đến khi một cái gì đó là bận rộn để chuyển đổi nhiệm vụ, chứ không phải là yanking qua lại tùy ý?

+0

Tôi mua mà chờ đợi cho những thứ khác mất rất nhiều thời gian, nhưng những gì về một tình huống mà một trang cụ thể có rất nhiều chế biến đang diễn ra và mất ~ 500ms để hoàn thành. Điều đó có nghĩa là mọi yêu cầu khác giữa bắt đầu và kết thúc của nó sẽ phải đợi đến 1/2 giây trước khi nó bắt đầu. Tôi đang suy nghĩ một kịch bản mà có rất nhiều số crunching trên những thứ mà không thể truy xuất được trong một thời trang đã biên dịch, tức là rất nhiều CPU, ít I/O. – CCw

+3

@CCw: Không, nó sẽ không, ít nhất là với nút.js bạn thiết lập một sự kiện cho quá trình đó và nhận được một cuộc gọi lại khi nó được thực hiện (trong ngắn hạn), trong khi phần còn lại của kịch bản tiếp tục làm việc trong async và phục vụ yêu cầu. Những gì bạn mô tả là ngược lại, phương pháp 'đồng bộ'. – stagas

+1

Thật vậy, một cái gì đó mà 500ms tính trên mỗi trang sẽ cần rất nhiều CPU để có được đồng thời - hoặc nên được cắt ra như một nhiệm vụ nền, với một sự kiện để hoàn thành nó. Hầu hết các hệ thống web balk với nhiều loại điều này chạy - rất nhiều ngăn xếp treo xung quanh, chủ đề được chuyển đổi và không ai nhận được nhiều thực hiện. Lập trình không đồng bộ buộc một người phải tách biệt các bit mã bị xáo trộn và suy nghĩ về toàn bộ hệ thống. – aredridel

6

Thực tế khung sự kiện dựa trên phù hợp cho các tình huống mà bạn có nhiều hoạt động io và ít CPU, nhưng điều đó xác định hầu hết các trang web, vì chúng đợi db. Các ví dụ khác là các cuộc trò chuyện hoặc video như youtube - một ngăn xếp cho phép phục vụ nhiều khách hàng hơn cùng một lúc. Các máy chủ dựa trên sự kiện có thể xử lý hàng chục hoặc hàng trăm khách hàng kết nối với nhau, nơi mà số lượng chủ đề đó sẽ giết chết máy. Chúng kém hiệu quả hơn khi bạn thực sự xử lý một số việc cần làm.

19

Bạn có thể sử dụng một trong các khung công tác này nếu bạn muốn viết mã kết nối mạng.

Ví dụ: nếu bạn định viết a massively multiplayer video game, "thiết lập chương trình Java ... để gửi một chuỗi cho mỗi yêu cầu" có thể không phải là một tùy chọn; tung hứng nhiều chủ đề phức tạp phi thường, và nó cũng hoạt động kém. Không phải đề cập đến thực tế là "chỉ sinh ra một loạt các chủ đề" là thiếu một loạt các công cụ quản lý Twisted et. al. có, như twistd, xử lý ghi nhật ký, thực hiện, khởi động và tắt máy, v.v.

Hoặc nếu bạn muốn viết build automation system, khả năng asynchronously invoke and control subprocesses sẽ hữu ích. Nếu bạn sinh ra một tiến trình không đồng bộ, bạn có thể dễ dàng giết chết quá trình đó và xử lý một cách duyên dáng với lối thoát của nó. Nếu bạn sinh ra nó bằng cách bắt đầu một luồng và chặn trong chuỗi đó, bạn không thể dừng nó một cách dễ dàng, kể từ stopping a thread is inherently unsafe.

EventMachine và Twisted đều có thể được sử dụng để viết các chương trình phía máy khách; có thể bạn đang viết một ứng dụng GUI không dựa trên web và bạn muốn sử dụng cùng một giao thức thực hiện trên máy khách và máy chủ.

Vì bạn có thể sử dụng khung không đồng bộ trong nhiều ngữ cảnh khác nhau, có thể bạn muốn sử dụng nó trong ứng dụng web đơn giản chỉ vì bạn có mã thư viện hiện tại, được viết cho một số ứng dụng khác sử dụng khung không đồng bộ của bạn để sử dụng. Hoặc bạn có thể muốn sử dụng lại mã ứng dụng web của mình trong một số ứng dụng phi web giả định trong tương lai. Trong trường hợp này, nó không khác nhiều so với việc sử dụng Apache hoặc Tomcat hay bất cứ điều gì về chức năng, nó chỉ cung cấp cho bạn một cách tổng quát hơn, có thể tái sử dụng để tổ chức chương trình của bạn.