我想要实现的目标: 我想将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()