Gói PyPI
Kể từ tháng 6 năm 2020, đây là các gói liên quan đến sự kiện có sẵn trên PyPI, được đặt hàng trước ngày phát hành gần đây nhất.
Còn nữa
Đó là rất nhiều thư viện để lựa chọn, sử dụng thuật ngữ rất khác nhau (sự kiện, tín hiệu, trình xử lý, công văn phương thức, hook, ...).
Tôi đang cố gắng giữ một cái nhìn tổng quan về các gói trên, cộng với các kỹ thuật được đề cập trong các câu trả lời ở đây.
Đầu tiên, một số thuật ngữ ...
Mẫu quan sát
Phong cách cơ bản nhất của hệ thống sự kiện là 'túi phương thức xử lý', đây là một triển khai đơn giản của mẫu Observer .
Về cơ bản, các phương thức xử lý (các hàm gọi được) được lưu trữ trong một mảng và mỗi phương thức được gọi khi sự kiện 'kích hoạt'.
Theo dõi công khai
Nhược điểm của hệ thống sự kiện Observer là bạn chỉ có thể đăng ký trình xử lý trên đối tượng Sự kiện thực tế (hoặc danh sách trình xử lý). Vì vậy, tại thời điểm đăng ký sự kiện đã cần phải tồn tại.
Đó là lý do tại sao kiểu thứ hai của các hệ thống sự kiện tồn tại:
mẫu đăng ký xuất bản . Ở đây, các trình xử lý không đăng ký trên một đối tượng sự kiện (hoặc danh sách xử lý), nhưng trên một bộ điều phối trung tâm. Ngoài ra các thông báo chỉ nói chuyện với người điều phối. Những gì cần nghe, hoặc những gì để xuất bản được xác định bởi 'signal', không có gì khác hơn một tên (chuỗi).
Mẫu hòa giải
Cũng có thể được quan tâm: mẫu Người hòa giải .
Móc
Hệ thống 'hook' được sử dụng thông thường trong bối cảnh các plugin ứng dụng. Ứng dụng chứa các điểm tích hợp cố định (hook) và mỗi plugin có thể kết nối với hook đó và thực hiện một số hành động nhất định.
Các sự kiện khác'
Lưu ý: phân luồng.Event không phải là một "hệ thống sự kiện" theo nghĩa trên. Đó là một hệ thống đồng bộ hóa luồng trong đó một luồng chờ cho đến khi một luồng khác 'báo hiệu' đối tượng Sự kiện.
Thư viện nhắn tin mạng cũng thường sử dụng thuật ngữ 'sự kiện'; đôi khi những điều này là tương tự trong khái niệm; đôi khi không. Tất nhiên họ có thể đi qua ranh giới luồng, quy trình và máy tính. Xem ví dụ:
pyzmq , pymq ,
Twisted , Tornado , gevent , eventlet .
Tài liệu tham khảo yếu
Trong Python, việc giữ tham chiếu đến một phương thức hoặc đối tượng đảm bảo rằng nó sẽ không bị xóa bởi trình thu gom rác. Điều này có thể được mong muốn, nhưng nó cũng có thể dẫn đến rò rỉ bộ nhớ: các trình xử lý được liên kết không bao giờ được dọn sạch.
Một số hệ thống sự kiện sử dụng tài liệu tham khảo yếu thay vì thông thường để giải quyết vấn đề này.
Một số từ về các thư viện khác nhau
Hệ thống sự kiện theo phong cách quan sát viên:
- zope.event chỉ ra những điều cốt lõi về cách thức hoạt động của nó (xem câu trả lời của Lennart ). Lưu ý: ví dụ này thậm chí không hỗ trợ các đối số xử lý.
- Việc triển khai list danh sách có thể gọi được của LongPoke cho thấy một hệ thống sự kiện như vậy có thể được triển khai rất tối giản bằng cách phân lớp
list
.
- Biến thể của Felk EventHook cũng đảm bảo chữ ký của callees và người gọi.
- Spassig's EventHook (Mẫu sự kiện của Michael Foord) là một triển khai đơn giản.
- Lớp Sự kiện Bài học có giá trị của Josip về cơ bản là giống nhau, nhưng sử dụng
set
thay vì list
để lưu trữ túi và thực hiện __call__
cả hai bổ sung hợp lý.
- PyNotify tương tự về khái niệm và cũng cung cấp các khái niệm bổ sung về các biến và điều kiện ('sự kiện thay đổi biến'). Trang chủ không hoạt động.
- axel về cơ bản là một túi xử lý với nhiều tính năng liên quan đến phân luồng, xử lý lỗi, ...
- python-Clark yêu cầu các lớp nguồn chẵn xuất phát từ
pydispatch.Dispatcher
.
- buslane dựa trên lớp, hỗ trợ các trình xử lý đơn hoặc nhiều và tạo điều kiện cho các gợi ý kiểu mở rộng.
- Observer / Event của Pithikos là một thiết kế gọn nhẹ.
Thư viện xuất bản-đăng ký:
- Blinker có một số tính năng tiện lợi như tự động ngắt kết nối và lọc dựa trên người gửi.
- PyPubSub là gói ổn định và hứa hẹn "các tính năng nâng cao hỗ trợ gỡ lỗi và duy trì các chủ đề và tin nhắn".
- pymitter là một cổng Python của Node.js EventEuctor2 và cung cấp các không gian tên, ký tự đại diện và TTL.
- PyDispatcher dường như nhấn mạnh tính linh hoạt liên quan đến xuất bản nhiều-nhiều, v.v. Hỗ trợ các tài liệu tham khảo yếu.
- louie là một PyDispatcher được làm lại và nên hoạt động "trong nhiều bối cảnh khác nhau".
- pypydispatcher dựa trên (bạn đoán nó ...) PyDispatcher và cũng hoạt động trong PyPy.
- django.dispatch là một PyDispatcher viết lại "với giao diện hạn chế hơn, nhưng hiệu suất cao hơn".
- pyeventdispatcher dựa trên bộ phân phối sự kiện của khung Symfony của PHP.
- Bộ điều phối được trích xuất từ django.dispatch nhưng đang trở nên khá cũ.
- EventManger của Cristian Garcia là một triển khai thực sự ngắn.
Khác:
- pluggy chứa một hệ thống hook được sử dụng bởi các
pytest
plugin.
- RxPy3 thực hiện mẫu có thể quan sát và cho phép hợp nhất các sự kiện, thử lại, v.v.
- Tín hiệu và Slots của Qt có sẵn từ PyQt
hoặc PySide2 . Chúng hoạt động như gọi lại khi được sử dụng trong cùng một luồng hoặc như các sự kiện (sử dụng vòng lặp sự kiện) giữa hai luồng khác nhau. Tín hiệu và Slots có giới hạn là chúng chỉ hoạt động trong các đối tượng của các lớp xuất phát từ đó
QObject
.