sql >> Database >  >> RDS >> PostgreSQL

Hoe ontvang ik automatische meldingen over wijzigingen in tabellen?

donmage heeft helemaal gelijk - LISTEN en NOTIFY zijn wat je wilt. Je hebt nog steeds een polling-lus nodig, maar deze is erg licht van gewicht en veroorzaakt geen detecteerbare serverbelasting.

Als je psycopg2 . wilt om elk moment terug te bellen in uw programma kunt u dit doen door een thread te spawnen en die thread de polling-lus te laten uitvoeren. Controleer of psycopg2 thread-safe verbindingstoegang afdwingt; als dat niet het geval is, moet u uw eigen vergrendeling doen, zodat uw polling-lus alleen wordt uitgevoerd als de verbinding inactief is en geen andere query's een polling-cyclus onderbreken. Of je kunt gewoon een tweede verbinding gebruiken voor je evenement polling.

Hoe dan ook, wanneer de achtergrondthread die peilt naar meldingsgebeurtenissen er een ontvangt, kan deze een Python-callback-functie aanroepen die wordt geleverd door uw hoofdprogramma, die gegevensstructuren / variabelen die door de rest van het programma worden gedeeld, kan wijzigen. Pas op, als je dit doet, kan het snel een nachtmerrie worden om te onderhouden.

Als je die aanpak volgt, raad ik je ten zeerste aan om de multithreading . te gebruiken / multiprocessing modulen. Ze zullen je leven enorm gemakkelijker maken, door eenvoudige manieren te bieden om gegevens tussen threads uit te wisselen en de wijzigingen die door de luisterthread worden aangebracht, te beperken tot eenvoudige en goed gecontroleerde locaties.

Als u threads gebruikt in plaats van processen, is het belangrijk om te begrijpen dat u in cPython (d.w.z. "normale Python") geen echte callback-interrupt kunt hebben, omdat er slechts één thread tegelijk in cPython kan worden uitgevoerd. Lees over het "global interpreter lock" (GIL) om hier meer over te weten. Vanwege deze beperking (en het eenvoudigere, veiligere karakter van shared-nothing standaard gelijktijdigheid) geef ik vaak de voorkeur aan multiprocessing boven multithreading.



  1. Geneste hashes opslaan in PostgreSQL met Rails 4 (en Hstore)

  2. SQL-tabel opvragen en dubbele rijen uit een resultatenset verwijderen

  3. Een relatie met een array afvlakken om één rij per array-invoer uit te zenden

  4. Mijn programma kan geen waarden opslaan in MySQL met behulp van mysql connector lib in Python