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

select

Mô-đ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  sở
+-- Bộ chọn chọn
+-- Bộ chọn thăm  ý 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:

Hằng số

Ý nghĩa

selectors.EVENT_READ

Có sẵn để đọc

selectors.EVENT_WRITE

Có sẵn để viết

class selectors.SelectorKey

SelectorKeynamedtuple đượ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ức BaseSelector.

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ụng DefaultSelector hoặc một trong SelectSelector, 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ó. BaseSelector và 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 SelectorKey mới hoặc tăng ValueError trong trường hợp mặt nạ sự kiện hoặc bộ mô tả tệp không hợp lệ hoặc KeyError nế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ăng KeyError nếu fileobj chưa được đăng ký. Nó sẽ tăng ValueError nếu fileobj không hợp lệ (ví dụ: nó không có phương thức fileno() hoặc phương thức fileno() 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 SelectorKey mới hoặc tăng ValueError trong trường hợp mặt nạ sự kiện hoặc bộ mô tả tệp không hợp lệ hoặc KeyError nế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ếu timeout <= 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 timeoutNone, 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 SelectorKey tươ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ăng KeyError nế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ản SelectorKey đượ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ạ)