使用Python为MongoDB连接创建连接池作为线程

使用Python为MongoDB连接创建连接池作为线程,python,mongodb,multithreading,pymongo,threadpool,Python,Mongodb,Multithreading,Pymongo,Threadpool,我想实现的目标: 我想将我的mongodb连接作为3-4个线程存储在内存中,通过内存我想创建一个连接池。我不想每次我的核心功能工作时都创建连接。如果我有一个连接池,那么我可以从池中获取连接,使用它并将其释放回池中,这是典型的用例 我尝试过的: 我考虑创建一个守护进程,根据工作线程的数量创建相应的线程。但问题是我如何保持连接始终处于活动状态,以便无论何时需要它,我都可以使用连接并释放它 我提到的链接 我了解到mongodb确实有内部连接池机制,我可以通过从中设置maxPoolSize=200来实现

我想实现的目标: 我想将我的mongodb连接作为3-4个线程存储在内存中,通过内存我想创建一个连接池。我不想每次我的核心功能工作时都创建连接。如果我有一个连接池,那么我可以从池中获取连接,使用它并将其释放回池中,这是典型的用例

我尝试过的: 我考虑创建一个守护进程,根据工作线程的数量创建相应的线程。但问题是我如何保持连接始终处于活动状态,以便无论何时需要它,我都可以使用连接并释放它

我提到的链接

我了解到mongodb确实有内部连接池机制,我可以通过从中设置maxPoolSize=200来实现。但在我的情况下,每个进程都会打开一个db连接,我负担不起,所以我想避免这样做,而不是在服务器启动时创建并保持一些连接

对于进程之间的变量共享,我可以使用它在python脚本之间进行对话

对于Python中的concurrent.futures库,我可以使用它创建池

用于Python中的各种线程相关库

我无法合并上述程序

问题

我做的对吗? 我们是否有其他方法来汇集连接并将其存储在RAM中,以便我可以在我的核心scipt需要db连接时访问它。 我不想创建与之相同的via套接字,因为通过套接字连接也可能会成为开销(我觉得是这样,但我不确定)

在下面的脚本中,我尝试在线程池的帮助下创建线程,并创建一些连接。我可以这样做,但我不确定如何将其存储在内存中,以便每次访问连接

import threading
import time
import logging
import configparser
from pymongo import MongoClient

logging.basicConfig(level=logging.DEBUG,
                format='(%(threadName)-9s) %(message)s',)

class ThreadPool(object):
    def __init__(self):
        super(ThreadPool, self).__init__()
        self.active = []
        self.lock = threading.Lock()
    def makeActive(self, name):
        with self.lock:
            self.active.append(name)
            logging.debug('Running: %s', self.active)
    def makeInactive(self, name):
        with self.lock:
            self.active.remove(name)
            logging.debug('Running: %s', self.active)

def f(s, pool):
    logging.debug('Waiting to join the pool')
    with s:
        name = threading.currentThread().getName()
        config = configparser.ConfigParser()
        config.read('.env')
        url = config['mongoDB']['url']
        port = config['mongoDB']['port']
        user = config['mongoDB']['user']
        password = config['mongoDB']['password']
        db = config['mongoDB']['db']

        connectionString = 'mongodb://' + user + ':' + password + '@' + url + ':' + port + '/' + db

        pool.makeActive(name)
        conn = MongoClient(connectionString)

        logging.debug(conn)
        #time.sleep(0.5)
        pool.makeInactive(name)

if __name__ == '__main__':
    pool = ThreadPool()
    s = threading.Semaphore(2)
    for i in range(10):
       t = threading.Thread(target=f, name='thread_'+str(i), args=(s, pool))
       t.daemon = True
       t.start()