sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvordan modtager man automatiske meddelelser om ændringer i tabeller?

donmage er helt rigtigt - LISTEN og NOTIFY er hvad du ønsker. Du skal stadig bruge en polling-loop, men den er meget let og forårsager ikke sporbar serverbelastning.

Hvis du vil have psycopg2 for at udløse tilbagekald til enhver tid i dit program kan du gøre dette ved at skabe en tråd og få den til at udføre polling-løkken. Tjek for at se, om psycopg2 gennemtvinger trådsikker forbindelsesadgang; hvis den ikke gør det, skal du lave din egen låsning, så din polling-loop kun kører, når forbindelsen er inaktiv, og ingen andre forespørgsler afbryder en polling-cyklus. Eller du kan bare bruge en anden forbindelse til din begivenhedsafstemning.

Uanset hvad, når baggrundstråden, der poller for notifikationsbegivenheder, modtager en, kan den påkalde en Python-tilbagekaldsfunktion leveret af dit hovedprogram, som kan ændre datastrukturer/variabler, der deles af resten af ​​programmet. Pas på, hvis du gør dette, at det hurtigt kan blive et mareridt at vedligeholde.

Hvis du tager den tilgang, anbefaler jeg kraftigt at bruge multithreading / multiprocessing moduler. De vil gøre dit liv enormt nemmere ved at give enkle måder at udveksle data mellem tråde på og begrænse ændringer foretaget af lyttetråden til enkle og velkontrollerede steder.

Hvis du bruger tråde i stedet for processer, er det vigtigt at forstå, at i cPython (dvs. "normal Python") kan du ikke have en ægte tilbagekaldsafbrydelse, fordi kun én tråd kan køre i cPython på én gang. Læs om den "globale tolkelås" (GIL) for at forstå mere om dette. På grund af denne begrænsning (og den nemmere, sikrere karakter af delt-intet som standard samtidighed) foretrækker jeg ofte multiprocessing frem for multithreading.



  1. PHP - Forkerte POST-data sendes gennem en formular ved ekko?

  2. Hvordan henter man Oracle-referencemarkøren til tabelvariablen?

  3. Hvad er den hurtigste måde at indsætte data i en Oracle-tabel?

  4. Sådan fungerer Div() i PostgreSQL