selectors --- Ghép kênh I/O cấp cao¶
Added in version 3.4.
Source code: Lib/selectors.py
Giới thiệu¶
Mô-đun này 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 nguyên thủy select. Thay vào đó, người dùng được khuyến khích sử dụng mô-đun này, 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.
Nó định nghĩa một lớp cơ sở trừu tượng BaseSelector, cùng với một số triển khai cụ thể (KqueueSelector, EpollSelector...), có thể được sử dụng để chờ thông báo sẵn sàng I/O trên nhiều đối tượng tệp. Trong phần sau, "đối tượng tệp" đề cập đến bất kỳ đối tượng nào có phương thức fileno() hoặc bộ mô tả tệp thô. Xem file object.
DefaultSelector là bí danh cho cách triển khai hiệu quả nhất hiện có trên nền tảng hiện tại: đây phải là lựa chọn mặc định cho hầu hết người dùng.
Ghi chú
Loại đối tượng tệp được hỗ trợ tùy thuộc vào nền tảng: trên Windows, ổ cắm được hỗ trợ, nhưng không có ống, trong khi trên Unix, cả hai đều được hỗ trợ (một số loại khác cũng có thể được hỗ trợ, chẳng hạn như fifos hoặc thiết bị tệp đặc biệt).
Xem thêm
selectMô-đun ghép kênh I/O cấp thấp.
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.
Lớp học¶
Hệ thống phân cấp lớp:
Bộ chọn cơ sở
+-- Bộ chọn chọn
+-- Bộ chọn thăm dò ý kiến
+-- EpollSelector
+-- DevpollSelector
+-- KqueueSelector
Trong phần sau, events là mặt nạ bitwise cho biết sự kiện I/O nào sẽ được chờ đợi trên một đối tượng tệp nhất định. Nó có thể là sự kết hợp của các hằng số của mô-đun bên dưới:
- class selectors.SelectorKey¶
SelectorKeylànamedtupleđược sử dụng để liên kết một đối tượng tệp với bộ mô tả tệp cơ bản, mặt nạ sự kiện đã chọn và dữ liệu đính kèm. Nó được trả về bằng một số phương thứcBaseSelector.- fileobj¶
Đối tượng tập tin đã đăng ký.
- fd¶
Bộ mô tả tập tin cơ bản.
- events¶
Các sự kiện phải được chờ đợi trên đối tượng tệp này.
- data¶
Dữ liệu mờ tùy chọn được liên kết với đối tượng tệp này: ví dụ: dữ liệu này có thể được sử dụng để lưu trữ ID phiên cho mỗi khách hàng.
- class selectors.BaseSelector¶
Một
BaseSelectorđược sử dụng để chờ sự kiện I/O sẵn sàng trên nhiều đối tượng tệp. Nó hỗ trợ đăng ký luồng tệp, hủy đăng ký và phương thức chờ sự kiện I/O trên các luồng đó, với thời gian chờ tùy chọn. Đây là lớp cơ sở trừu tượng nên không thể khởi tạo được. Thay vào đó, hãy sử dụngDefaultSelectorhoặc một trongSelectSelector,KqueueSelector, v.v. nếu bạn muốn sử dụng cụ thể một triển khai và nền tảng của bạn hỗ trợ nó.BaseSelectorvà các triển khai cụ thể của nó hỗ trợ giao thức context manager.- abstractmethod register(fileobj, events, data=None)¶
Đăng ký một đối tượng tệp để lựa chọn, theo dõi các sự kiện I/O.
fileobj là đối tượng tệp cần theo dõi. Nó có thể là một bộ mô tả tệp số nguyên hoặc một đối tượng có phương thức
fileno(). events là mặt nạ bitwise của các sự kiện cần theo dõi. data là một đối tượng mờ đục.Điều này trả về một phiên bản
SelectorKeymới hoặc tăngValueErrortrong trường hợp mặt nạ sự kiện hoặc bộ mô tả tệp không hợp lệ hoặcKeyErrornếu đối tượng tệp đã được đăng ký.
- abstractmethod unregister(fileobj)¶
Hủy đăng ký một đối tượng tệp khỏi vùng chọn, loại bỏ nó khỏi quá trình giám sát. Một đối tượng tập tin sẽ được hủy đăng ký trước khi bị đóng.
fileobj phải là đối tượng tệp đã được đăng ký trước đó.
Điều này trả về phiên bản
SelectorKeyđược liên kết hoặc tăngKeyErrornếu fileobj chưa được đăng ký. Nó sẽ tăngValueErrornếu fileobj không hợp lệ (ví dụ: nó không có phương thứcfileno()hoặc phương thứcfileno()của nó có giá trị trả về không hợp lệ).
- modify(fileobj, events, data=None)¶
Thay đổi các sự kiện được theo dõi hoặc dữ liệu đính kèm của đối tượng tệp đã đăng ký.
Điều này tương đương với
BaseSelector.unregister(fileobj)theo sau làBaseSelector.register(fileobj, events, data), ngoại trừ việc nó có thể được triển khai hiệu quả hơn.Điều này trả về một phiên bản
SelectorKeymới hoặc tăngValueErrortrong trường hợp mặt nạ sự kiện hoặc bộ mô tả tệp không hợp lệ hoặcKeyErrornếu đối tượng tệp không được đăng ký.
- abstractmethod select(timeout=None)¶
Đợi cho đến khi một số đối tượng tệp đã đăng ký sẵn sàng hoặc hết thời gian chờ.
Nếu
timeout > 0, điều này chỉ định thời gian chờ tối đa, tính bằng giây. Nếutimeout <= 0, cuộc gọi sẽ không bị chặn và sẽ báo cáo các đối tượng tệp hiện sẵn sàng. Nếu timeout làNone, cuộc gọi sẽ chặn cho đến khi đối tượng tệp được giám sát sẵn sàng.Điều này trả về một danh sách các bộ dữ liệu
(key, events), một bộ cho mỗi đối tượng tệp sẵn sàng.key là phiên bản
SelectorKeytương ứng với đối tượng tệp sẵn sàng. events là một bitmask của các sự kiện có sẵn trên đối tượng tệp này.Ghi chú
Phương thức này có thể trả về trước khi bất kỳ đối tượng tệp nào sẵn sàng hoặc hết thời gian chờ nếu quy trình hiện tại nhận được tín hiệu: trong trường hợp này, một danh sách trống sẽ được trả về.
Thay đổi trong phiên bản 3.5: Bộ chọn 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 nếu trình xử lý tín hiệu không đưa ra ngoại lệ (xem PEP 475 để biết lý do), thay vì trả về danh sách sự kiện trống trước khi hết thời gian chờ.
- close()¶
Đóng bộ chọn.
Điều này phải được gọi để đảm bảo rằng mọi tài nguyên cơ bản đều được giải phóng. Bộ chọn sẽ không được sử dụng khi nó đã được đóng lại.
- get_key(fileobj)¶
Trả về khóa được liên kết với đối tượng tệp đã đăng ký.
Điều này trả về phiên bản
SelectorKeyđược liên kết với đối tượng tệp này hoặc tăngKeyErrornếu đối tượng tệp chưa được đăng ký.
- abstractmethod get_map()¶
Trả về ánh xạ của các đối tượng tệp tới các phím chọn.
Điều này trả về một phiên bản
Mappingánh xạ các đối tượng tệp đã đăng ký tới phiên bảnSelectorKeyđược liên kết của chúng.
- class selectors.DefaultSelector¶
Lớp bộ chọn mặc định, sử dụng cách triển khai hiệu quả nhất hiện có trên nền tảng hiện tại. Đây phải là lựa chọn mặc định cho hầu hết người dùng.
- class selectors.SelectSelector¶
bộ chọn dựa trên
select.select().
- class selectors.PollSelector¶
bộ chọn dựa trên
select.poll().
- class selectors.EpollSelector¶
bộ chọn dựa trên
select.epoll().- fileno()¶
Điều này trả về bộ mô tả tệp được sử dụng bởi đối tượng
select.epoll()cơ bản.
- class selectors.DevpollSelector¶
bộ chọn dựa trên
select.devpoll().- fileno()¶
Điều này trả về bộ mô tả tệp được sử dụng bởi đối tượng
select.devpoll()cơ bản.
Added in version 3.5.
- class selectors.KqueueSelector¶
bộ chọn dựa trên
select.kqueue().- fileno()¶
Điều này trả về bộ mô tả tệp được sử dụng bởi đối tượng
select.kqueue()cơ bản.
Ví dụ¶
Đây là cách triển khai máy chủ echo đơn giản
bộ chọn nhập
ổ cắm nhập khẩu
sel = bộ chọn.DefaultSelector()
chắc chắn chấp nhận(vớ, mặt nạ):
conn, addr = sock.accept() # Should hãy sẵn sàng
print('được chấp nhận', conn, 'từ', addr)
conn.setblocking(Sai)
sel.register(conn, selectors.EVENT_READ, đọc)
đọc chắc chắn (kết nối, mặt nạ):
data = conn.recv(1000) # Should hãy sẵn sàng
nếu dữ liệu:
print('echoing', repr(data), 'to', conn)
conn.send(data) # Hope nó sẽ không chặn
khác:
print('đóng', conn)
sel.unregister(conn)
conn.close()
sock = socket.socket()
sock.bind(('localhost', 1234))
sock.listen(100)
sock.setblocking(Sai)
sel.register(sock, selectors.EVENT_READ, chấp nhận)
trong khi Đúng:
sự kiện = sel.select()
đối với khóa, mặt nạ trong các sự kiện:
gọi lại = key.data
gọi lại (key.fileobj, mặt nạ)