donmage khá đúng - LISTEN
và NOTIFY
là những gì bạn muốn. Bạn vẫn sẽ cần một vòng lặp thăm dò, nhưng nó rất nhẹ và sẽ không gây ra tải máy chủ có thể phát hiện được.
Nếu bạn muốn psycopg2
để kích hoạt các cuộc gọi lại vào bất kỳ lúc nào trong chương trình của bạn, bạn có thể thực hiện việc này bằng cách tạo một luồng và để luồng đó thực hiện vòng lặp thăm dò. Kiểm tra xem liệu psycopg2 có thực thi quyền truy cập kết nối an toàn theo luồng hay không; nếu không, bạn sẽ cần thực hiện khóa riêng của mình để vòng lặp thăm dò của bạn chỉ chạy khi kết nối không hoạt động và không có truy vấn nào khác làm gián đoạn chu kỳ bỏ phiếu. Hoặc bạn chỉ có thể sử dụng kết nối thứ hai để thăm dò sự kiện của mình.
Dù bằng cách nào, khi luồng nền đang thăm dò các sự kiện thông báo nhận được một luồng, nó có thể gọi hàm gọi lại Python do chương trình chính của bạn cung cấp, hàm này có thể sửa đổi cấu trúc / biến dữ liệu được chia sẻ bởi phần còn lại của chương trình. Hãy cẩn thận, nếu bạn làm điều này, nó có thể nhanh chóng trở thành cơn ác mộng để duy trì.
Nếu bạn thực hiện cách tiếp cận đó, tôi thực sự khuyên bạn nên sử dụng multithreading
/ multiprocessing
các mô-đun. Chúng sẽ giúp cuộc sống của bạn trở nên dễ dàng hơn nhiều, cung cấp các cách đơn giản để trao đổi dữ liệu giữa các chuỗi và hạn chế các sửa đổi do chuỗi lắng nghe thực hiện ở các vị trí đơn giản và được kiểm soát tốt.
Nếu sử dụng các luồng thay vì các quy trình, điều quan trọng là phải hiểu rằng trong cPython (tức là "Python bình thường"), bạn không thể có ngắt gọi lại thực sự, vì chỉ một luồng có thể đang thực thi trong cPython cùng một lúc. Đọc về "khóa thông dịch viên toàn cầu" (GIL) để hiểu thêm về điều này. Do hạn chế này (và tính chất dễ dàng hơn, an toàn hơn của chia sẻ không có gì theo đồng thời mặc định), tôi thường thích đa xử lý hơn đa luồng.