PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Por que `libpq` usa polling em vez de notificação para busca de dados?


No modelo de execução de um programa monothread, o fluxo de execução não pode ser interrompido por dados que retornam de uma consulta assíncrona ou, mais geralmente, de um soquete de rede. Apenas sinais (SIGTERM e amigos) podem interromper o fluxo, mas os sinais não podem ser ligados aos dados que chegam.

É por isso que não é possível ter um retorno de chamada para ser notificado sobre os dados recebidos. O pedaço de código na libpq que seria necessário para emitir o retorno de chamada nunca seria executado se seu código não o chamasse. E se você tiver que ligar, isso anula todo o objetivo de um retorno de chamada.

Existem bibliotecas como Qt que fornecem retornos de chamada, mas são arquitetados desde o início com um loop principal que atua como um processador de eventos. O código do usuário é organizado em retornos de chamada e o processamento de dados de entrada baseado em eventos é possível. Mas, neste caso, a biblioteca se apropria do fluxo de execução, o que significa que seu mainloop pesquisa as fontes de dados. Isso apenas transfere a responsabilidade para outro pedaço de código fora da libpq.