创建连接池作为线程以与Python进行MongoDB连接

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

我尝试过的事情: 我想到了创建一个Daemon进程,通过该进程根据工作人员的数量创建相应的线程。但是问题是如何使连接始终保持活动状态,以便在需要时可以使用该连接并释放它。

我引荐的链接

我读到mongodb确实具有内部连接池机制,我可以通过从https://api.mongodb.com/python/current/faq.html#how-does-connection-pooling-work-in-pymongo设置maxPoolSize = 200来实现。但是在我的情况下,仍然为每个进程打开一个数据库连接,我负担不起,因此想避免这种情况,我想在引导服务器时创建并保持一些连接活动。>

https://stackoverflow.com/a/14700365用于在进程之间共享变量,使用它我可以在python脚本之间进行对话。

https://stackoverflow.com/a/14299004用于Python中的current.futures库,使用此库我可以创建池。

https://realpython.com/intro-to-python-threading/用于Python中的各种与线程相关的库

我无法组合以上程序。

问题

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

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

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()
kukududushen 回答:创建连接池作为线程以与Python进行MongoDB连接

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3081893.html

大家都在问