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() và 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:
- 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ẵnepoll_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à
0hoặcselect.EPOLL_CLOEXEC, nếu không thìOSErrorsẽ đượ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
epollhỗ trợ giao thức quản lý ngữ cảnh: khi được sử dụng trong câu lệnhwith, 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_CLOEXEChiện được sử dụng theo mặc định. Sử dụngos.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ênfileno()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.stdinhoặc các đối tượng được trả về bởiopen()hoặcos.popen()), các đối tượng socket được trả về bởisocket.socket(). Bạn cũng có thể tự xác định một lớp wrapper, miễn là nó có phương thứcfileno()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() là O(highest file descriptor) và poll() là O(number of file descriptors), /dev/poll là O(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¶
Truenế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ứcfileno()trả về số nguyên. Các đối tượng tệp triển khaifileno(), 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,POLLPRIvàPOLLOUT.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ứcfileno()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ả đó ---POLLINcho đầ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ặcNone, 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
EPOLLINCó sẵn để đọc
EPOLLOUTCó sẵn để viết
EPOLLPRIDữ liệu khẩn cấp để đọc
EPOLLERRTình trạng lỗi đã xảy ra trên PGS. fd
EPOLLHUPCú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ộ
EPOLLEXCLUSIVEChỉ đá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.
EPOLLRDHUPTruyền phát kết nối đóng ngang ổ cắm hoặc tắt ghi một nửa kết nối.
EPOLLRDNORMTương đương với
EPOLLIN
EPOLLRDBANDDải dữ liệu ưu tiên có thể được đọc.
EPOLLWRNORMTương đương với
EPOLLOUT
EPOLLWRBANDDữ liệu ưu tiên có thể được ghi.
EPOLLMSGĐã bỏ qua.
EPOLLWAKEUPNgă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¶
Truenế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
EBADFnữ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() là O(highest file descriptor), trong khi poll() là 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ứcfileno()trả về số nguyên. Các đối tượng tệp triển khaifileno(), 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,POLLPRIvàPOLLOUT, đượ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
POLLINCó dữ liệu để đọc
POLLPRICó dữ liệu khẩn cấp để đọc
POLLOUTSẵn sàng cho đầu ra: việc ghi sẽ không bị chặn
POLLERRTình trạng lỗi của một số loại
POLLHUPCúp máy
POLLRDHUPTruyền phát kết nối đóng ngang ổ cắm hoặc tắt ghi một nửa kết nối
POLLNVALYê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ệOSErrorvới errnoENOENT.
- 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ứcfileno()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ặcNone, 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¶
Truenế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
Nonemax_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_READLấy một bộ mô tả và trả về bất cứ khi nào có dữ liệu để đọc
KQ_FILTER_WRITELấy một bộ mô tả và trả về bất cứ khi nào có dữ liệu để ghi
KQ_FILTER_AIOyêu cầu AIO
KQ_FILTER_VNODETrả 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_PROCTheo dõi các sự kiện trên id tiến trình
KQ_FILTER_NETDEVTheo dõi các sự kiện trên thiết bị mạng [không khả dụng trên macOS]
KQ_FILTER_SIGNALTrả về bất cứ khi nào tín hiệu đã xem được gửi đến tiến trình
KQ_FILTER_TIMERThiết lập bộ đếm thời gian tùy ý
- kevent.flags¶
Lọc hành động.
Hằng số
Ý nghĩa
KQ_EV_ADDThêm hoặc sửa đổi một sự kiện
KQ_EV_DELETEXóa một sự kiện khỏi hàng đợi
KQ_EV_ENABLECho phép control() trả về sự kiện
KQ_EV_DISABLETắt sự kiện
KQ_EV_ONESHOTXó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_SYSFLAGSsự kiện nội bộ
KQ_EV_FLAG1sự kiện nội bộ
KQ_EV_EOFLọc điều kiện EOF cụ thể
KQ_EV_ERRORXem giá trị trả về
- kevent.fflags¶
Lọc các cờ cụ thể.
Cờ lọc
KQ_FILTER_READvàKQ_FILTER_WRITE:Hằng số
Ý nghĩa
KQ_NOTE_LOWATvạch nước thấp của bộ đệm ổ cắm
cờ lọc
KQ_FILTER_VNODE:Hằng số
Ý nghĩa
KQ_NOTE_DELETEunlink() đã được gọi
KQ_NOTE_WRITEmột bài viết đã xảy ra
KQ_NOTE_EXTENDtập tin đã được mở rộng
KQ_NOTE_ATTRIBmột thuộc tính đã được thay đổi
KQ_NOTE_LINKsố lượng liên kết đã thay đổi
KQ_NOTE_RENAMEtập tin đã được đổi tên
KQ_NOTE_REVOKEquyề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_EXITquá trình đã thoát
KQ_NOTE_FORKquá trình này được gọi là fork()
KQ_NOTE_EXECquá trình đã thực hiện một quá trình mới
KQ_NOTE_PCTRLMASKcờ lọc nội bộ
KQ_NOTE_PDATAMASKcờ lọc nội bộ
KQ_NOTE_TRACKtheo 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_TRACKERRkhô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_LINKUPliên kết đã sẵn sàng
KQ_NOTE_LINKDOWNliên kết bị hỏng
KQ_NOTE_LINKINVtrạ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.