2010-12-15 23 views
32

Tôi đã đọc về trình quản lý IO mới trong GHC, sử dụng các thông báo sự kiện không đồng bộ và tránh việc chặn I/O để đạt được thông lượng cao.Trình quản lý GHC IO hỗ trợ hoạt động IO nào?

Hoạt động IO nào đủ điều kiện để quản lý bằng mã IO không đồng bộ mới? Đọc và ghi các tập tin và hoạt động mạng? Truy cập cơ sở dữ liệu? Có các loại IO mà người quản lý phải sử dụng để chặn không?

+2

Wow ... 4 mục yêu thích nhưng chỉ có một phụ đề. Thật kỳ lạ. – fuz

+0

@FUZxxl StackOverflow có mục yêu thích? Tôi hoàn toàn nhận thấy rằng vì nhận xét của bạn. – alternative

+0

@monadic Vâng, có. Chỉ cần nhấn nút bắt đầu ngay dưới một câu hỏi để yêu thích nó. Nếu có gì đó thay đổi, bạn sẽ nhận được thông báo như thể đó là câu hỏi của riêng bạn. – fuz

Trả lời

26

Bất kỳ bộ mô tả tệp nào có thể được quản lý bởi epoll/kqueue đều đủ điều kiện. Thư viện mà muốn xử lý không đồng bộ I/O cần phải hợp tác với người quản lý I/O bằng

  • làm file descriptor non-blocking, và
  • gọi các chức năng threadWaitReadthreadWaitWrite trong GHC.Conc trước khi thử lại một cuộc gọi hệ thống trước đây đã trả về EWOULDBLOCK.

Điều này đã được thực hiện cho các loại HandleSocket. Nếu bạn sử dụng, ví dụ: một ràng buộc với thư viện cơ sở dữ liệu C, bạn sẽ nhận được hành vi chặn vì thư viện đó sẽ không hợp tác với trình quản lý I/O.

+8

Tôi có thể lưu ý rằng 'tibbe' có lẽ là * người biết * trong lĩnh vực này :) –

5

Một câu trả lời nào thỏa đáng:

Trái tim của người quản lý GHC IO mới là một vòng lặp kqueue()/epoll() sự kiện. Vì vậy, tôi sẽ mong đợi bất cứ điều gì có thể được xây dựng trên đầu trang này để đủ điều kiện - nếu không phải bây giờ, sau đó. Đặc biệt điều này có nghĩa:

  • file IO
  • Mạng IO

Mã (Tôi nhìn nó một số tháng trước và những thứ có thể đã thay đổi) cũng có hỗ trợ cho việc đăng ký và chạy timeouts khác nhau các loại thông qua hàng đợi ưu tiên (tìm kiếm). Điều này cho thấy rằng hầu hết các cuộc gọi giống như sleep cũng có thể được hiển thị trên giao diện.

Giới thiệu về truy cập cơ sở dữ liệu: chắc chắn, bạn thường truy nhập cơ sở dữ liệu thông qua một ổ cắm mạng IO để gọi forkIO và thực hiện truy cập DB trong một luồng riêng biệt nên có thể thực hiện, nhanh chóng và an toàn. Việc truyền dữ liệu trở lại phần còn lại của ứng dụng có thể được thực hiện với một trong các phương tiện đồng thời, Chan hoặc STM.TChan.

Tôi không nghĩ rằng có các loại IO, nơi người quản lý phải sử dụng để chặn mỗi lần truy cập, nhưng tôi có thể tưởng tượng rằng một số thư viện có thể phá vỡ trình quản lý IO mới và đi thẳng cho jugular. Họ sẽ, tất nhiên, khối.

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