使用Python为MongoDB连接创建连接池作为线程
我想实现的目标: 我想将我的mongodb连接作为3-4个线程存储在内存中,通过内存我想创建一个连接池。我不想每次我的核心功能工作时都创建连接。如果我有一个连接池,那么我可以从池中获取连接,使用它并将其释放回池中,这是典型的用例 我尝试过的: 我考虑创建一个守护进程,根据工作线程的数量创建相应的线程。但问题是我如何保持连接始终处于活动状态,以便无论何时需要它,我都可以使用连接并释放它 我提到的链接 我了解到mongodb确实有内部连接池机制,我可以通过从中设置maxPoolSize=200来实现。但在我的情况下,每个进程都会打开一个db连接,我负担不起,所以我想避免这样做,而不是在服务器启动时创建并保持一些连接 对于进程之间的变量共享,我可以使用它在python脚本之间进行对话 对于Python中的concurrent.futures库,我可以使用它创建池 用于Python中的各种线程相关库 我无法合并上述程序 问题 我做的对吗? 我们是否有其他方法来汇集连接并将其存储在RAM中,以便我可以在我的核心scipt需要db连接时访问它。 我不想创建与之相同的via套接字,因为通过套接字连接也可能会成为开销(我觉得是这样,但我不确定) 在下面的脚本中,我尝试在线程池的帮助下创建线程,并创建一些连接。我可以这样做,但我不确定如何将其存储在内存中,以便每次访问连接使用Python为MongoDB连接创建连接池作为线程,python,mongodb,multithreading,pymongo,threadpool,Python,Mongodb,Multithreading,Pymongo,Threadpool,我想实现的目标: 我想将我的mongodb连接作为3-4个线程存储在内存中,通过内存我想创建一个连接池。我不想每次我的核心功能工作时都创建连接。如果我有一个连接池,那么我可以从池中获取连接,使用它并将其释放回池中,这是典型的用例 我尝试过的: 我考虑创建一个守护进程,根据工作线程的数量创建相应的线程。但问题是我如何保持连接始终处于活动状态,以便无论何时需要它,我都可以使用连接并释放它 我提到的链接 我了解到mongodb确实有内部连接池机制,我可以通过从中设置maxPoolSize=200来实现
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()