PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Pourquoi `libpq` utilise-t-il l'interrogation plutôt que la notification pour la récupération de données ?

Dans le modèle d'exécution d'un programme mono-thread, le flux d'exécution ne peut pas être interrompu par des données provenant d'une requête asynchrone, ou plus généralement d'un socket réseau. Seuls les signaux (SIGTERM et amis) peuvent interrompre le flux, mais les signaux ne peuvent pas être accrochés aux données entrantes.

C'est pourquoi il n'est pas possible d'avoir un rappel pour être averti des données entrantes. Le morceau de code dans libpq qui serait nécessaire pour émettre le rappel ne s'exécuterait jamais si votre code ne l'appelait pas. Et si vous devez l'appeler, cela annule tout l'intérêt d'un rappel.

Il existe des librairies comme Qt qui fournissent des rappels, mais ils sont architecturés à partir de zéro avec une boucle principale qui agit comme un processeur d'événements. Le code utilisateur est organisé en rappels et un traitement événementiel des données entrantes est possible. Mais dans ce cas, la bibliothèque s'approprie le flux d'exécution, ce qui signifie que sa boucle principale interroge les sources de données. Cela ne fait que déplacer la responsabilité vers un autre morceau de code en dehors de libpq.