在 Python 中的多个进程之间共享数据库客户端?

Sharing DB client among multiple processes in Python?

我的 python 应用程序使用 concurrent.futures.ProcessPoolExecutor 和 5 个工作人员,每个进程进行多个数据库查询。

是选择为每个进程提供自己的数据库客户端,还是让所有进程共享一个客户端,这被认为更安全和更传统?

最好使用多线程或异步方法而不是多处理,因为它会消耗更少的资源。这样你就可以使用单个数据库连接,但我建议为每个工作人员或协程创建一个单独的会话以避免一些异常或锁定问题。

简短回答:为每个进程(需要它)提供自己的数据库客户端。

长答案:你想解决什么问题?

基本上不会在进程之间共享数据库客户端;你必须有一个进程,它让数据库客户端代理来自其他人的查询,或多或少使用你自己的协议。如果该协议特定于您的应用程序,那可能会有好处,但它会增加复杂性:您现在将在您的程序中拥有两种不同类型的工人,而不仅仅是一种,加上它们之间的协议。您需要确保收益大于额外的复杂性。

通常可以在线程之间共享数据库客户端;您必须检查文档以查看哪些对象和操作是“线程安全的”。但是,由于您的应用程序 CPU-heavy,由于 Python 限制(GIL),线程不适合。

同时,在每个进程中拥有一个数据库客户端的成本很小;在任何情况下,您都需要 一些 类型的客户端,它也可能是直接的客户端。

不会有更多的 IO,因为这主要基于查询总数和数据量,而不管它是来自一个进程还是分布在多个进程中。唯一额外的 IO 将在登录中,而且并不多。

如果您 运行 没有数据库连接,您可以 tune/upgrade 您的数据库以获得更多连接,或者使用单独的现成“连接池”来共享他们;这可能比尝试从头开始实施连接池要好得多。

更一般地说,这远远超出了这个特定的问题,以一种直接的方式组合几个现成的部分通常比尝试将一个定制的复杂部分放在一起更好一下子搞定。

那么,您要解决什么问题?