select --- Đang chờ hoàn thành I/O


Mô-đun này cung cấp quyền truy cập vào các chức năng select()poll() có sẵn trong hầu hết các hệ điều hành, devpoll() có sẵn trên Solaris và các phiên bản phái sinh, epoll() có sẵn trên Linux 2.5+ và kqueue() có sẵn trên hầu hết BSD. Lưu ý rằng trên Windows, nó chỉ hoạt động với các ổ cắm; trên các hệ điều hành khác, nó cũng hoạt động với các loại tệp khác (đặc biệt, trên Unix, nó hoạt động trên các đường ống). Nó không thể được sử dụng trên các tệp thông thường để xác định xem tệp có tăng trưởng kể từ lần đọc cuối cùng hay không.

Ghi chú

Mô-đun selectors cho phép ghép kênh I/O cấp cao và hiệu quả, được xây dựng dựa trên mô-đun gốc select. Thay vào đó, người dùng được khuyến khích sử dụng mô-đun selectors, trừ khi họ muốn kiểm soát chính xác các nguyên hàm cấp hệ điều hành được sử dụng.

sẵn có: not WASI.

Mô-đun này không hoạt động hoặc không có trên WebAssembly. Xem Nền tảng WebAssugging để biết thêm thông tin.

Mô-đun này xác định như sau:

exception select.error

Bí danh OSError không được dùng nữa.

Thay đổi trong phiên bản 3.3: Sau PEP 3151, lớp này được đặt bí danh là OSError.

select.devpoll()

(Chỉ được hỗ trợ trên Solaris và các công cụ phái sinh.) Trả về đối tượng thăm dò /dev/poll; xem phần Đối tượng bỏ phiếu /dev/poll bên dưới để biết các phương thức được đối tượng devpoll hỗ trợ.

Các đối tượng devpoll() được liên kết với số lượng bộ mô tả tệp được phép tại thời điểm khởi tạo. Nếu chương trình của bạn giảm giá trị này, devpoll() sẽ thất bại. Nếu chương trình của bạn tăng giá trị này, devpoll() có thể trả về danh sách không đầy đủ các bộ mô tả tệp đang hoạt động.

Bộ mô tả tập tin mới là non-inheritable.

Added in version 3.3.

Thay đổi trong phiên bản 3.4: Bộ mô tả tệp mới hiện không thể kế thừa được.

select.epoll(sizehint=-1, flags=0)

(Chỉ được hỗ trợ trên Linux 2.5.44 trở lên.) Trả về một đối tượng thăm dò biên, có thể được sử dụng làm giao diện Edge hoặc Level Triggered cho các sự kiện I/O.

sizehint thông báo cho epoll về số lượng sự kiện dự kiến sẽ được đăng ký. Nó phải là số dương hoặc -1 để sử dụng mặc định. Nó chỉ được sử dụng trên các hệ thống cũ không có sẵn epoll_create1(); nếu không thì nó không có tác dụng (mặc dù giá trị của nó vẫn được kiểm tra).

flags không được dùng nữa và hoàn toàn bị bỏ qua. Tuy nhiên, khi được cung cấp, giá trị của nó phải là 0 hoặc select.EPOLL_CLOEXEC, nếu không thì OSError sẽ được nâng lên.

Xem phần Đối tượng thăm dò kích hoạt cạnh và cấp độ (epoll) bên dưới để biết các phương thức được hỗ trợ bởi các đối tượng epolling.

Các đối tượng epoll hỗ trợ giao thức quản lý ngữ cảnh: khi được sử dụng trong câu lệnh with, bộ mô tả tệp mới sẽ tự động được đóng ở cuối khối.

Bộ mô tả tập tin mới là non-inheritable.

Thay đổi trong phiên bản 3.3: Đã thêm tham số flags.

Thay đổi trong phiên bản 3.4: Hỗ trợ cho câu lệnh with đã được thêm vào. Bộ mô tả tệp mới hiện không thể kế thừa được.

Sắp loại bỏ từ phiên bản 3.4: Thông số flags. select.EPOLL_CLOEXEC hiện được sử dụng theo mặc định. Sử dụng os.set_inheritable() để làm cho bộ mô tả tệp có thể kế thừa.

select.poll()

(Không được hỗ trợ bởi tất cả các hệ điều hành.) Trả về một đối tượng thăm dò, hỗ trợ đăng ký và hủy đăng ký các bộ mô tả tệp, sau đó thăm dò chúng cho các sự kiện I/O; xem phần Đối tượng bỏ phiếu bên dưới để biết các phương pháp được các đối tượng thăm dò hỗ trợ.

select.kqueue()

(Chỉ được hỗ trợ trên BSD.) Trả về đối tượng hàng đợi kernel; xem phần Đối tượng Kqueue bên dưới để biết các phương thức được đối tượng kqueue hỗ trợ.

Bộ mô tả tập tin mới là non-inheritable.

Thay đổi trong phiên bản 3.4: Bộ mô tả tệp mới hiện không thể kế thừa được.

select.kevent(ident, filter=KQ_FILTER_READ, flags=KQ_EV_ADD, fflags=0, data=0, udata=0)

(Chỉ được hỗ trợ trên BSD.) Trả về đối tượng sự kiện kernel; xem phần Đối tượng Kevent bên dưới để biết các phương thức được hỗ trợ bởi các đối tượng kevent.

select.select(rlist, wlist, xlist, timeout=None)

Đây là giao diện đơn giản cho lệnh gọi hệ thống Unix select(). Ba đối số đầu tiên là các biến lặp của 'đối tượng có thể chờ': hoặc là số nguyên biểu thị bộ mô tả tệp hoặc đối tượng có phương thức không tham số có tên fileno() trả về số nguyên như vậy:

  • rlist: đợi cho đến khi sẵn sàng đọc

  • wlist: đợi cho đến khi sẵn sàng viết

  • xlist: đợi "điều kiện đặc biệt" (xem trang hướng dẫn để biết hệ thống của bạn coi điều kiện đó là gì)

Cho phép các vòng lặp trống, nhưng việc chấp nhận ba vòng lặp trống phụ thuộc vào nền tảng. (Nó được biết là hoạt động trên Unix nhưng không hoạt động trên Windows.) Đối số timeout tùy chọn chỉ định thời gian chờ dưới dạng số dấu phẩy động tính bằng giây. Khi đối số timeout bị bỏ qua hoặc None, hàm sẽ chặn cho đến khi có ít nhất một bộ mô tả tệp sẵn sàng. Giá trị hết thời gian bằng 0 chỉ định một cuộc thăm dò và không bao giờ chặn.

Giá trị trả về là bộ ba danh sách các đối tượng đã sẵn sàng: tập hợp con của ba đối số đầu tiên. Khi hết thời gian chờ mà bộ mô tả tệp chưa sẵn sàng, ba danh sách trống sẽ được trả về.

Trong số các loại đối tượng được chấp nhận trong các vòng lặp có Python file objects (ví dụ: sys.stdin hoặc các đối tượng được trả về bởi open() hoặc os.popen()), các đối tượng socket được trả về bởi socket.socket(). Bạn cũng có thể tự xác định một lớp wrapper, miễn là nó có phương thức fileno() thích hợp (thực sự trả về một bộ mô tả tệp, không chỉ là một số nguyên ngẫu nhiên).

Ghi chú

Các đối tượng tệp trên Windows không được chấp nhận, nhưng ổ cắm thì có. Trên Windows, hàm select() cơ bản được thư viện WinSock cung cấp và không xử lý các bộ mô tả tệp không bắt nguồn từ WinSock.

Thay đổi trong phiên bản 3.5: Hàm này hiện được thử lại với thời gian chờ được tính toán lại khi bị gián đoạn bởi tín hiệu, ngoại trừ nếu trình xử lý tín hiệu đưa ra một ngoại lệ (xem PEP 475 để biết lý do), thay vì tăng InterruptedError.

select.PIPE_BUF

Số byte tối thiểu có thể được ghi mà không chặn vào đường ống khi đường ống đã được báo cáo là sẵn sàng để ghi bởi select(), poll() hoặc giao diện khác trong mô-đun này. Điều này không áp dụng cho các loại đối tượng giống như tệp khác như ổ cắm.

Giá trị này được POSIX đảm bảo tối thiểu là 512.

sẵn có: Unix

Added in version 3.2.

Đối tượng bỏ phiếu /dev/poll

Solaris và các dẫn xuất có /dev/poll. Trong khi select()O(highest file descriptor) và poll()O(number of file descriptors), /dev/pollO(active file descriptors).

Hành vi của /dev/poll rất gần với đối tượng poll() tiêu chuẩn.

devpoll.close()

Đóng bộ mô tả tập tin của đối tượng bỏ phiếu.

Added in version 3.4.

devpoll.closed

True nếu đối tượng bỏ phiếu bị đóng.

Added in version 3.4.

devpoll.fileno()

Trả về số mô tả tệp của đối tượng bỏ phiếu.

Added in version 3.4.

devpoll.register(fd[, eventmask])

Đăng ký một bộ mô tả tập tin với đối tượng bỏ phiếu. Sau đó, các lệnh gọi tới phương thức poll() sẽ kiểm tra xem bộ mô tả tệp có bất kỳ sự kiện I/O nào đang chờ xử lý hay không. fd có thể là số nguyên hoặc đối tượng có phương thức fileno() trả về số nguyên. Các đối tượng tệp triển khai fileno(), vì vậy chúng cũng có thể được sử dụng làm đối số.

eventmask là một bitmask tùy chọn mô tả loại sự kiện bạn muốn kiểm tra. Các hằng số giống như với đối tượng poll(). Giá trị mặc định là sự kết hợp của các hằng số POLLIN, POLLPRIPOLLOUT.

Cảnh báo

Việc đăng ký bộ mô tả tệp đã được đăng ký không phải là lỗi nhưng kết quả không được xác định. Hành động thích hợp là hủy đăng ký hoặc sửa đổi nó trước tiên. Đây là điểm khác biệt quan trọng so với poll().

devpoll.modify(fd[, eventmask])

Phương pháp này thực hiện unregister() theo sau là register(). Nó hiệu quả hơn (một chút) so với việc làm tương tự một cách rõ ràng.

devpoll.unregister(fd)

Xóa bộ mô tả tệp đang được theo dõi bởi đối tượng bỏ phiếu. Giống như phương thức register(), fd có thể là một số nguyên hoặc một đối tượng có phương thức fileno() trả về một số nguyên.

Việc cố gắng xóa bộ mô tả tệp chưa từng được đăng ký sẽ bị bỏ qua một cách an toàn.

devpoll.poll([timeout])

Thăm dò tập hợp các bộ mô tả tệp đã đăng ký và trả về một danh sách có thể trống chứa 2 bộ (fd, event) cho các bộ mô tả có sự kiện hoặc lỗi cần báo cáo. fd là bộ mô tả tệp và event là một bitmask với các bit được đặt cho các sự kiện được báo cáo cho bộ mô tả đó --- POLLIN cho đầu vào đang chờ, POLLOUT để chỉ ra rằng bộ mô tả có thể được ghi vào, v.v. Danh sách trống cho biết cuộc gọi đã hết thời gian chờ và không có bộ mô tả tệp nào có bất kỳ sự kiện nào cần báo cáo. Nếu timeout được cung cấp, nó chỉ định khoảng thời gian tính bằng mili giây mà hệ thống sẽ đợi các sự kiện trước khi quay lại. Nếu timeout bị bỏ qua, -1 hoặc None, cuộc gọi sẽ chặn cho đến khi có sự kiện cho đối tượng thăm dò ý kiến ​​này.

Thay đổi trong phiên bản 3.5: Hàm này hiện được thử lại với thời gian chờ được tính toán lại khi bị gián đoạn bởi tín hiệu, ngoại trừ nếu trình xử lý tín hiệu đưa ra một ngoại lệ (xem PEP 475 để biết lý do), thay vì tăng InterruptedError.

Đối tượng thăm dò kích hoạt cạnh và cấp độ (epoll)

https://linux.die.net/man/4/epoll

eventmask

Hằng số

Ý nghĩa

EPOLLIN

Có sẵn để đọc

EPOLLOUT

Có sẵn để viết

EPOLLPRI

Dữ liệu khẩn cấp để đọc

EPOLLERR

Tình trạng lỗi đã xảy ra trên PGS. fd

EPOLLHUP

Cúp máy xảy ra trên PGS. fd

EPOLLET

Đặt hành vi Kích hoạt cạnh, mặc định là hành vi Kích hoạt cấp độ

EPOLLONESHOT

Đặt hành vi một lần. Sau khi một sự kiện được rút ra, fd sẽ bị vô hiệu hóa nội bộ

EPOLLEXCLUSIVE

Chỉ đánh thức một đối tượng epoll khi fd liên quan có một sự kiện. Giá trị mặc định (nếu cờ này không được đặt) là đánh thức tất cả các đối tượng epoll đang thăm dò trên fd.

EPOLLRDHUP

Truyền phát kết nối đóng ngang ổ cắm hoặc tắt ghi một nửa kết nối.

EPOLLRDNORM

Tương đương với EPOLLIN

EPOLLRDBAND

Dải dữ liệu ưu tiên có thể được đọc.

EPOLLWRNORM

Tương đương với EPOLLOUT

EPOLLWRBAND

Dữ liệu ưu tiên có thể được ghi.

EPOLLMSG

Đã bỏ qua.

EPOLLWAKEUP

Ngăn chặn giấc ngủ trong khi chờ đợi sự kiện.

Added in version 3.6: EPOLLEXCLUSIVE đã được thêm vào. Nó chỉ được hỗ trợ bởi Linux Kernel 4.5 trở lên.

Added in version 3.14: EPOLLWAKEUP đã được thêm vào. Nó chỉ được hỗ trợ bởi Linux Kernel 3.5 trở lên.

epoll.close()

Đóng bộ mô tả tệp điều khiển của đối tượng epoll.

epoll.closed

True nếu đối tượng epoll bị đóng.

epoll.fileno()

Trả về số mô tả tệp của điều khiển fd.

epoll.fromfd(fd)

Tạo một đối tượng epoll từ một bộ mô tả tệp nhất định.

epoll.register(fd[, eventmask])

Đăng ký bộ mô tả fd với đối tượng epoll.

epoll.modify(fd, eventmask)

Sửa đổi một bộ mô tả tập tin đã đăng ký.

epoll.unregister(fd)

Xóa bộ mô tả tệp đã đăng ký khỏi đối tượng epoll.

Thay đổi trong phiên bản 3.9: Phương pháp này không còn bỏ qua lỗi EBADF nữa.

epoll.poll(timeout=None, maxevents=-1)

Chờ đợi sự kiện. thời gian chờ tính bằng giây (thả nổi)

Thay đổi trong phiên bản 3.5: Hàm này hiện được thử lại với thời gian chờ được tính toán lại khi bị gián đoạn bởi tín hiệu, ngoại trừ nếu trình xử lý tín hiệu đưa ra một ngoại lệ (xem PEP 475 để biết lý do), thay vì tăng InterruptedError.

Đối tượng bỏ phiếu

Lệnh gọi hệ thống poll(), được hỗ trợ trên hầu hết các hệ thống Unix, cung cấp khả năng mở rộng tốt hơn cho các máy chủ mạng phục vụ nhiều máy khách cùng một lúc. poll() có quy mô tốt hơn vì lệnh gọi hệ thống chỉ yêu cầu liệt kê các bộ mô tả tệp quan tâm, trong khi select() xây dựng một bitmap, bật các bit cho fds quan tâm và sau đó toàn bộ bitmap phải được quét lại một cách tuyến tính. select()O(highest file descriptor), trong khi poll()O(number of file descriptors).

poll.register(fd[, eventmask])

Đăng ký một bộ mô tả tập tin với đối tượng bỏ phiếu. Sau đó, các lệnh gọi tới phương thức poll() sẽ kiểm tra xem bộ mô tả tệp có bất kỳ sự kiện I/O nào đang chờ xử lý hay không. fd có thể là số nguyên hoặc đối tượng có phương thức fileno() trả về số nguyên. Các đối tượng tệp triển khai fileno(), vì vậy chúng cũng có thể được sử dụng làm đối số.

eventmask là một bitmask tùy chọn mô tả loại sự kiện bạn muốn kiểm tra và có thể là sự kết hợp của các hằng số POLLIN, POLLPRIPOLLOUT, được mô tả trong bảng bên dưới. Nếu không được chỉ định, giá trị mặc định được sử dụng sẽ kiểm tra cả 3 loại sự kiện.

Hằng số

Ý nghĩa

POLLIN

Có dữ liệu để đọc

POLLPRI

Có dữ liệu khẩn cấp để đọc

POLLOUT

Sẵn sàng cho đầu ra: việc ghi sẽ không bị chặn

POLLERR

Tình trạng lỗi của một số loại

POLLHUP

Cúp máy

POLLRDHUP

Truyền phát kết nối đóng ngang ổ cắm hoặc tắt ghi một nửa kết nối

POLLNVAL

Yêu cầu không hợp lệ: phần mô tả không mở

Việc đăng ký bộ mô tả tệp đã được đăng ký không phải là lỗi và có tác dụng tương tự như việc đăng ký bộ mô tả chính xác một lần.

poll.modify(fd, eventmask)

Sửa đổi một fd đã được đăng ký. Điều này có tác dụng tương tự như register(fd, eventmask). Việc cố gắng sửa đổi bộ mô tả tệp chưa bao giờ được đăng ký sẽ gây ra ngoại lệ OSError với errno ENOENT.

poll.unregister(fd)

Xóa bộ mô tả tệp đang được theo dõi bởi đối tượng bỏ phiếu. Giống như phương thức register(), fd có thể là một số nguyên hoặc một đối tượng có phương thức fileno() trả về một số nguyên.

Việc cố gắng xóa bộ mô tả tệp chưa từng được đăng ký sẽ gây ra ngoại lệ KeyError.

poll.poll([timeout])

Thăm dò tập hợp các bộ mô tả tệp đã đăng ký và trả về một danh sách có thể trống chứa 2 bộ (fd, event) cho các bộ mô tả có sự kiện hoặc lỗi cần báo cáo. fd là bộ mô tả tệp và event là một bitmask với các bit được đặt cho các sự kiện được báo cáo cho bộ mô tả đó --- POLLIN để chờ đầu vào, POLLOUT để chỉ ra rằng bộ mô tả có thể được ghi vào, v.v. Danh sách trống cho biết cuộc gọi đã hết thời gian chờ và không có bộ mô tả tệp nào có bất kỳ sự kiện nào cần báo cáo. Nếu timeout được cung cấp, nó chỉ định khoảng thời gian tính bằng mili giây mà hệ thống sẽ đợi các sự kiện trước khi quay lại. Nếu timeout bị bỏ qua, phủ định hoặc None, lệnh gọi sẽ chặn cho đến khi có sự kiện cho đối tượng thăm dò ý kiến ​​này.

Thay đổi trong phiên bản 3.5: Hàm này hiện được thử lại với thời gian chờ được tính toán lại khi bị gián đoạn bởi tín hiệu, ngoại trừ nếu trình xử lý tín hiệu đưa ra một ngoại lệ (xem PEP 475 để biết lý do), thay vì tăng InterruptedError.

Đối tượng Kqueue

kqueue.close()

Đóng bộ mô tả tệp điều khiển của đối tượng kqueue.

kqueue.closed

True nếu đối tượng kqueue bị đóng.

kqueue.fileno()

Trả về số mô tả tệp của điều khiển fd.

kqueue.fromfd(fd)

Tạo một đối tượng kqueue từ một bộ mô tả tệp nhất định.

kqueue.control(changelist, max_events[, timeout]) eventlist

Giao diện cấp thấp với kevent

  • danh sách thay đổi phải là một đối tượng có thể lặp lại của kevent hoặc None

  • max_events phải bằng 0 hoặc số nguyên dương

  • thời gian chờ tính bằng giây (có thể nổi); mặc định là None, đợi mãi

Thay đổi trong phiên bản 3.5: Hàm này hiện được thử lại với thời gian chờ được tính toán lại khi bị gián đoạn bởi tín hiệu, ngoại trừ nếu trình xử lý tín hiệu đưa ra một ngoại lệ (xem PEP 475 để biết lý do), thay vì tăng InterruptedError.

Đối tượng Kevent

https://man.freebsd.org/cgi/man.cgi?query=kqueue&sektion=2

kevent.ident

Giá trị được sử dụng để xác định sự kiện. Việc giải thích phụ thuộc vào bộ lọc nhưng thường là bộ mô tả tệp. Trong hàm tạo, danh tính có thể là int hoặc đối tượng có phương thức fileno(). kevent lưu trữ số nguyên bên trong.

kevent.filter

Tên của bộ lọc hạt nhân.

Hằng số

Ý nghĩa

KQ_FILTER_READ

Lấy một bộ mô tả và trả về bất cứ khi nào có dữ liệu để đọc

KQ_FILTER_WRITE

Lấy một bộ mô tả và trả về bất cứ khi nào có dữ liệu để ghi

KQ_FILTER_AIO

yêu cầu AIO

KQ_FILTER_VNODE

Trả về khi xảy ra một hoặc nhiều sự kiện được yêu cầu được xem trong fflag

KQ_FILTER_PROC

Theo dõi các sự kiện trên id tiến trình

KQ_FILTER_NETDEV

Theo dõi các sự kiện trên thiết bị mạng [không khả dụng trên macOS]

KQ_FILTER_SIGNAL

Trả về bất cứ khi nào tín hiệu đã xem được gửi đến tiến trình

KQ_FILTER_TIMER

Thiết lập bộ đếm thời gian tùy ý

kevent.flags

Lọc hành động.

Hằng số

Ý nghĩa

KQ_EV_ADD

Thêm hoặc sửa đổi một sự kiện

KQ_EV_DELETE

Xóa một sự kiện khỏi hàng đợi

KQ_EV_ENABLE

Cho phép control() trả về sự kiện

KQ_EV_DISABLE

Tắt sự kiện

KQ_EV_ONESHOT

Xóa sự kiện sau lần xuất hiện đầu tiên

KQ_EV_CLEAR

Đặt lại trạng thái sau khi truy xuất một sự kiện

KQ_EV_SYSFLAGS

sự kiện nội bộ

KQ_EV_FLAG1

sự kiện nội bộ

KQ_EV_EOF

Lọc điều kiện EOF cụ thể

KQ_EV_ERROR

Xem giá trị trả về

kevent.fflags

Lọc các cờ cụ thể.

Cờ lọc KQ_FILTER_READKQ_FILTER_WRITE:

Hằng số

Ý nghĩa

KQ_NOTE_LOWAT

vạch nước thấp của bộ đệm ổ cắm

cờ lọc KQ_FILTER_VNODE:

Hằng số

Ý nghĩa

KQ_NOTE_DELETE

unlink() đã được gọi

KQ_NOTE_WRITE

một bài viết đã xảy ra

KQ_NOTE_EXTEND

tập tin đã được mở rộng

KQ_NOTE_ATTRIB

một thuộc tính đã được thay đổi

KQ_NOTE_LINK

số lượng liên kết đã thay đổi

KQ_NOTE_RENAME

tập tin đã được đổi tên

KQ_NOTE_REVOKE

quyền truy cập vào tập tin đã bị thu hồi

cờ lọc KQ_FILTER_PROC:

Hằng số

Ý nghĩa

KQ_NOTE_EXIT

quá trình đã thoát

KQ_NOTE_FORK

quá trình này được gọi là fork()

KQ_NOTE_EXEC

quá trình đã thực hiện một quá trình mới

KQ_NOTE_PCTRLMASK

cờ lọc nội bộ

KQ_NOTE_PDATAMASK

cờ lọc nội bộ

KQ_NOTE_TRACK

theo một quy trình trên fork()

KQ_NOTE_CHILD

được trả về trong tiến trình con của NOTE_TRACK

KQ_NOTE_TRACKERR

không thể gắn bó với một đứa trẻ

Cờ lọc KQ_FILTER_NETDEV (không khả dụng trên macOS):

Hằng số

Ý nghĩa

KQ_NOTE_LINKUP

liên kết đã sẵn sàng

KQ_NOTE_LINKDOWN

liên kết bị hỏng

KQ_NOTE_LINKINV

trạng thái liên kết không hợp lệ

kevent.data

Lọc dữ liệu cụ thể.

kevent.udata

Giá trị do người dùng xác định.