2008-11-25 40 views

Trả lời

3

Xoắn có non-blocking writes on file descriptors. Nếu bạn đang viết mã không đồng bộ, tôi hy vọng bạn sẽ sử dụng xoắn, dù sao đi nữa. :)

+10

Đáng buồn thay, O_NONBLOCK (đó là những gì các API fdesc bạn liên kết đến thực sự) không làm việc với các tệp đĩa cứng cục bộ. tức là, thông số POSIX nói rằng nó nên được bỏ qua và nó được bỏ qua dutifully trên mọi hệ thống UNIX tôi biết. Nếu bạn nghĩ rằng đây là một ý tưởng ngu ngốc, tôi không thể đồng ý nhiều hơn nhưng có rất nhiều lý do lịch sử và thực hiện tại sao điều này là như vậy. Tóm lại, nếu bạn muốn IO không đồng bộ vào các tệp đĩa cứng cục bộ, bạn nên sử dụng các luồng và trì hoãn IO đến một luồng IO hoặc sử dụng API AIO. – mathieu

17

Khi tôi hiểu mọi thứ, I/O không đồng bộ không hoàn toàn giống với I/O không chặn.

Trong trường hợp của non-blocking I/O, một lần một bộ mô tả tập tin được thiết lập là "non-blocking", một cuộc gọi read() hệ thống (ví dụ) sẽ trở lại EWOULDBLOCK (hoặc EAGAIN) nếu hoạt động đọc sẽ chặn quá trình gọi điện thoại để hoàn thành hoạt động. Hệ thống gọi select(), poll(), epoll(), v.v. được cung cấp để quá trình có thể yêu cầu hệ điều hành được thông báo khi một hoặc nhiều bộ mô tả tệp trở thành có sẵn để thực hiện một số thao tác I/O.

I/O không đồng bộ hoạt động bằng cách xếp hàng yêu cầu I/O vào bộ mô tả tệp, được theo dõi độc lập với quá trình gọi. Đối với một bộ mô tả tập tin hỗ trợ I/O không đồng bộ (thường là devcies đĩa thô), một quá trình có thể gọi aio_read() (ví dụ) để yêu cầu một số byte được đọc từ bộ mô tả tệp. Cuộc gọi hệ thống trả về ngay lập tức, cho dù I/O đã hoàn thành hay chưa. Một thời gian sau, quá trình này sau đó thăm dò ý kiến ​​hệ điều hành để hoàn thành hoàn thành của I/O (nghĩa là, bộ đệm được lấp đầy dữ liệu).

Quy trình (đơn luồng) chỉ thực hiện I/O không chặn sẽ có thể đọc hoặc ghi từ một bộ mô tả tệp sẵn sàng cho I/O khi người khác chưa sẵn sàng. Nhưng quá trình này vẫn phải đồng bộ phát hành các cuộc gọi hệ thống để thực hiện I/O cho tất cả các mô tả tệp đã sẵn sàng. Trong khi đó, trong trường hợp I/O không đồng bộ, quá trình này chỉ kiểm tra việc hoàn thành I/O (bộ đệm đầy dữ liệu). Với I/O không đồng bộ, hệ điều hành có quyền tự do hoạt động song song càng nhiều càng tốt để phục vụ I/O, nếu nó chọn.

Với điều đó, có bất kỳ trình bao bọc nào cho hệ thống aio_read/write vv của POSIX gọi cho Python không?

+0

Một điều cần thêm: Khi người nhận xét về phản hồi đầu tiên cho biết, không có hệ thống nào thực sự theo dõi O_NONBLOCK trên các tệp - nó thực sự chỉ dành cho ổ cắm. Nếu bạn muốn tập tin async di động IO trên Unix, bạn phải sử dụng POSIX AIO hoặc xóa IO đồng bộ của bạn thành một luồng. –

0

Python 3 dường như có chức năng như vậy. Xem PEP 3116.

+1

Có vẻ như PEP 3116 có liên quan đến một trừu tượng I/O mới bao gồm I/O không chặn. Tuy nhiên, I/O không chặn không giống như I/O không đồng bộ. I/O không chặn thường không áp dụng cho hệ thống tập tin cục bộ. –

2

Tôi đang phát triển aio.h bidings để python: pyaio

Nó chạy trên chỉ linux ..

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