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.