sql >> Databáze >  >> RDS >> PostgreSQL

Jak přijímat automatická upozornění na změny v tabulkách?

donmage má naprostou pravdu - LISTEN a NOTIFY jsou to, co chcete. Stále budete potřebovat smyčku dotazování, ale je velmi lehká a nezpůsobí zjistitelné zatížení serveru.

Pokud chcete psycopg2 ke spuštění zpětných volání kdykoli ve vašem programu to můžete udělat tak, že vytvoříte vlákno a necháte toto vlákno spustit smyčku dotazování. Zkontrolujte, zda psycopg2 vynucuje přístup k bezpečnému připojení; pokud tomu tak není, budete muset provést vlastní zamykání, aby vaše smyčka dotazování běžela pouze v době, kdy je připojení nečinné, a žádné další dotazy nepřerušovaly cyklus dotazování. Nebo můžete použít druhé připojení pro dotazování událostí.

Ať tak či onak, když vlákno na pozadí, které se dotazuje na události oznámení, nějakou obdrží, může vyvolat funkci zpětného volání Pythonu dodávanou vaším hlavním programem, která může upravit datové struktury / proměnné sdílené zbytkem programu. Pozor, pokud to uděláte, může se to rychle stát noční můrou.

Pokud použijete tento přístup, důrazně doporučuji použít multithreading / multiprocessing moduly. Masivně vám usnadní život, poskytnou jednoduché způsoby výměny dat mezi vlákny a omezí úpravy provedené naslouchajícím vláknem na jednoduchá a dobře ovladatelná místa.

Pokud místo procesů používáte vlákna, je důležité pochopit, že v cPythonu (tj. „normálním Pythonu“) nemůžete mít skutečné přerušení zpětného volání, protože v cPythonu může být spuštěno pouze jedno vlákno najednou. Přečtěte si o „global interpreter lock“ (GIL), abyste o tom porozuměli více. Kvůli tomuto omezení (a snazší a bezpečnější povaze souběžného sdílení – nic ve výchozím nastavení) často preferuji multiprocesing před multithreadingem.



  1. Použijte SET TEXTSIZE k omezení dat vrácených pro každý řádek na serveru SQL Server

  2. Jak přejmenovat tabulku v SQL

  3. Jak vložit dotaz SQL do pole v yii

  4. JPA Qyery k nalezení záznamů mezi rozsahem