我想提高 Postgresql 扩展的性能,当然也考虑多线程。虽然粗略地,我知道到目前为止Postgresql是基于多进程的,并且在扩展中,Postgresql使用了诸如SRF_FIRSTCALL_INIT()、SRF_PERCALL_SETUP、MemoryContextSwitchTo()、CreateTemplateTupleDesc()、palloc()、Int64GetDatum等的东西,所以我的问题:
- 以上 API 是线程安全的吗?
- 在Postgresql扩展中使用多线程可以吗?如果是的话,您能提供一些例子,或者提供一些建议吗?
- 是否有任何多进程框架实际上更适合扩展?像LaunchParallelWorker()和RegisterBackgroundWorker()一样,它们是否适用于扩展?
- 有什么方法可以在扩展中并行执行某些操作吗?
在 PostgreSQL 函数中使用线程是不安全且被禁止的。PostgreSQL 不支持这一点,信号处理等重要功能将不再可靠。
PostgreSQL 大量使用信号。例如,如果表定义发生更改,所有进程都会收到一个信号,使它们丢弃该表的所有缓存元数据和执行计划。对于线程,不清楚进程的哪个线程处理信号。
简而言之:PostgreSQL 后端不是线程安全的,如果启动线程,那么可能会发生不好的事情。也许他们不会在你的用例中,但我当然不会冒险。