文档称连接池也不是为多线程设计的:
至关重要的是,当使用连接池时,以及扩展时
使用通过 create_engine() 创建的引擎,
连接不会与分叉进程共享。 TCP 连接是
表示为文件描述符,通常跨进程工作
边界,这意味着这将导致对文件的并发访问
描述符代表两个或多个完全独立的Python
口译员指出。
据我了解,如果我创建连接池:
self.engine = create_engine('postgresql://{user}:{password}@{host}:{port}/{db}'.format(
user=Configuration().get(section='repository', option='user'),
password=Configuration().get(section='repository', option='password'),
host=Configuration().get(section='repository', option='host'),
port=Configuration().get(section='repository', option='port'),
db=Configuration().get(section='repository', option='database')
), echo=False, pool_size=3)
self.session = sessionmaker(self.engine, expire_on_commit=False)
然后打电话self.session()
在不同的线程中,我将有 3 个不同的连接,它们在 N 个不同的线程中使用。
这是否意味着只有 3 个并发线程会执行某些工作,而其他线程将等待一个或多个线程调用session.close()
?或者有可能 >2 个线程同时使用同一个连接?
NullPool 是否更安全(因为每个新会话都是一个新连接)?
self.engine = create_engine('postgresql://{user}:{password}@{host}:{port}/{db}'.format(
user=Configuration().get(section='repository', option='user'),
password=Configuration().get(section='repository', option='password'),
host=Configuration().get(section='repository', option='host'),
port=Configuration().get(section='repository', option='port'),
db=Configuration().get(section='repository', option='database')
), echo=False, poolclass=NullPool)
一般问题:在这种情况下使用相同的连接池是否可以:
engine = create_engine('connection_string', echo=False, pool_size=3)
Session = sessionmaker(engine)
def some_function():
session = Session()
...
pool = Pool(processes=10)
pool.map(some_function)
pool.close()
pool.join()