2010-09-24 34 views
6

Gần đây tôi tình cờ gặp thư viện JS khá trơn tru này được gọi là nodeJS hoạt động như JS phía máy chủ.không chặn (I/O điều khiển sự kiện) so với chặn I/O

Tính năng chính của ngôn ngữ là I/O được tổ chức cung cấp khả năng vốn có của I/O hoàn toàn không bị chặn bằng cách sử dụng gọi lại !!!

Câu hỏi của tôi là, nếu loại cơ chế I/O hoàn toàn không chặn này tồn tại trong quá khứ (do I/O điều khiển sự kiện đã tồn tại trong một thời gian dài), tại sao chúng không phổ biến hơn ở mức cao các ngôn ngữ như C# và Java (mặc dù Java có thực hiện NIO hỗ trợ I/O không chặn)?

Hiện tại, một kết quả hoạt động đọc/ghi đơn giản dẫn đến việc chặn I/O hoàn chỉnh, không phải trường hợp với I/O điều khiển sự kiện.

Tôi muốn hiểu rõ hơn về I/O theo hướng sự kiện và cách nó khác với những gì chúng tôi có trong Java.

+4

Tôi tò mò tại sao bạn nghĩ Java/C# không có IO không đồng bộ? –

+0

Bạn có nghĩa là sử dụng gói Java NIO ??. Tôi chưa bao giờ sử dụng nó nhưng tôi biết nó rất có khả năng. Tôi sẽ thay đổi câu hỏi để giải quyết vấn đề này. –

Trả lời

5

Java: http://en.wikipedia.org/wiki/New_I/O

Một ghép, chặn phi I/O cơ sở cho việc viết các máy chủ mở rộng

NET: http://msdn.microsoft.com/en-us/library/dxkwh6zw.aspx

public IAsyncResult BeginReceive(
    byte[] buffer, 
    int offset, 
    int size, 
    SocketFlags socketFlags, 
    AsyncCallback callback, 
    Object state 
) 
+0

Kirk tuyệt vời !!. Nhưng bạn có thể giải thích thêm về New I/O không. Sự kiện có được thúc đẩy không? Tôi đang cố gắng so sánh nó với nodeJS. Lý do tại sao nodeJS là rất phổ biến là vì nó là sự kiện điều khiển I/O. –

+0

Tôi không chắc liệu đó có phải là "sự kiện" được điều khiển theo nghĩa của bạn hay không, nhưng đây là một hướng dẫn tuyệt vời: http://rox-xmlrpc.sourceforge.net/niotut/ –

+3

@A_Var: Một công cụ hướng sự kiện thực sự là chỉ là một sự trừu tượng của các máy trạng thái. Trong các ngôn ngữ không có động cơ điều khiển sự kiện tích hợp, hầu hết các nhà phát triển chỉ cần viết máy trạng thái riêng của họ bằng cách sử dụng một vòng lặp while và các câu lệnh switch (hoặc một bảng công văn). Đôi khi các nhà phát triển có thể bị làm phiền đủ để khái quát hóa việc triển khai máy nhà nước của họ để tạo API ra khỏi nó dẫn đến thư viện hướng sự kiện cho ngôn ngữ. Một ví dụ về điều này là khuôn khổ Twisted của Python. – slebetman

-4

Java có hỗ trợ xấu ngay cả đối với tệp I/O cơ bản. Các ngôn ngữ này được tạo ra để tạo nhanh các ứng dụng GUI di động và không cho các hoạt động I/O cấp thấp và phụ thuộc vào hệ điều hành.

+0

Tôi không thể nói, câu trả lời này có phải là một trò đùa không? –

+0

Điều này không so sánh với I/O đã xảy ra và chỉ trích Java I/O. Có Java không chặn I/O thông qua đa luồng (không thuần túy không chặn I/O mặc dù) là khác nhau từ sự kiện điều khiển I/O (đó là tinh khiết không chặn I/O) nhưng mỗi có riêng của nó chuyên nghiệp và con của. Vui lòng hỗ trợ tuyên bố của bạn với các ví dụ. –

1

Theo tôi được biết, có một nhận thức phổ biến rộng rãi rằng đa luồng dễ dàng hơn so với hướng sự kiện, vì trong lập trình đa luồng mỗi luồng có một luồng thực thi tuần tự đơn giản, trong khi sự kiện điều khiển bao gồm rất nhiều đoạn mã nhỏ.

Tất nhiên, điều này được nêu rõ hơn ở nơi khác, xem ví dụ Q.2 của state-threads FAQ.

3

Tcl có sự kiện điều khiển I/O từ những năm 1990 (nếu tôi không nhầm lẫn). Chắc chắn trước năm 2000 vì đó là khi tclhttpd đánh bại Apache trong các bài kiểm tra điểm chuẩn vào năm 2000, mọi người bắt đầu chú ý đến I/O không bị chặn. Khi mọi người thấy điều đó, họ bắt đầu viết lại các máy chủ web. Một trong những kết quả ban đầu là Lighttpd: một trong những máy chủ web không chặn đầu tiên được viết bằng C. Vào thời điểm đó, sử dụng I/O theo hướng sự kiện trong tcl thông qua lệnh fileevent đã được coi là thực hành tiêu chuẩn trong thế giới tcl.

AOLserver có (và vẫn còn) có lõi tcl và nó lưu trữ một trong những trang web bận rộn nhất trên web (ít nhất là trong những ngày đầu): http://www.aol.com/. Mặc dù bản thân máy chủ được viết bằng C, nó sử dụng API C của tcl để thực hiện xử lý sự kiện và I/O. Lý do AOLserver sử dụng hệ thống con I/O của tcl là vì nó sử dụng tcl như một ngôn ngữ kịch bản và các nhà phát triển nghĩ rằng vì ai đó đã viết nó sau đó cũng có thể sử dụng nó.

Tôi tin rằng AOLserver được phát hành lần đầu tiên vào năm 1995. Điều đó sẽ xác nhận rằng I/O theo hướng sự kiện đã có sẵn trong khoảng giữa thập niên 90.

Tcl là một trong những sớm nhất, nếu không phải là ngôn ngữ sớm nhất để có công cụ hướng sự kiện được xây dựng. Hệ thống con sự kiện ban đầu được triển khai cho thư viện Tk và sau đó được hợp nhất thành tcl.

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