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

Perché `libpq` usa il polling anziché la notifica per il recupero dei dati?

Nel modello di esecuzione di un programma mono-thread, il flusso di esecuzione non può essere interrotto da dati che tornano da una query asincrona, o più in generale da un socket di rete. Solo segnali (SIGTERM e amici) potrebbero interrompere il flusso, ma i segnali non possono essere agganciati ai dati in arrivo.

Ecco perché non è possibile avere una richiamata per ricevere una notifica dei dati in arrivo. Il pezzo di codice in libpq che sarebbe necessario per emettere il callback non verrebbe mai eseguito se il tuo codice non lo chiama. E se devi chiamarlo, questo annulla l'intero punto di una richiamata.

Ci sono librerie come Qt che forniscono callback, ma sono architettati da zero con un ciclo principale che funge da processore di eventi. Il codice utente è organizzato in richiamate ed è possibile l'elaborazione dei dati in entrata basata su eventi. Ma in questo caso la libreria assume la proprietà del flusso di esecuzione, il che significa che il suo mainloop esegue il polling delle origini dati. Questo sposta semplicemente la responsabilità su un altro pezzo di codice al di fuori di libpq.