Eu gostaria de melhorar o desempenho de uma extensão Postgresql e certamente o multi-thread é considerado. Embora aproximadamente, eu saiba que até agora o Postgresql é baseado em vários processos e, na extensão, coisas do Postgresql como SRF_FIRSTCALL_INIT(), SRF_PERCALL_SETUP, MemoryContextSwitchTo(), CreateTemplateTupleDesc(), palloc(), Int64GetDatum e assim por diante são usadas, então minhas perguntas :
- As APIs acima são thread-safe?
- Posso usar multithread na extensão Postgresql? Em caso afirmativo, você forneceria algum exemplo ou alguma sugestão?
- Existe alguma estrutura de múltiplos processos que seja realmente preferível para extensão? Assim como LaunchParallelWorker() e RegisterBackgroundWorker(), eles são aplicáveis para extensão?
- Existe algum método para realizar algo em paralelo na extensão?
Usar threads em uma função PostgreSQL não é seguro e é proibido. O PostgreSQL não tem suporte para isso, e recursos importantes como manipulação de sinais não funcionarão mais de maneira confiável.
PostgreSQL usa muitos sinais. Por exemplo, se a definição de uma tabela for alterada, todos os processos receberão um sinal que os fará descartar todos os metadados armazenados em cache e planos de execução dessa tabela. Com threads, não está claro qual thread do processo trata o sinal.
Resumindo: o backend do PostgreSQL não é seguro para threads e, se você iniciar threads, coisas ruins podem acontecer. Talvez não no seu caso de uso, mas eu certamente não arriscaria.