【发布时间】:2019-01-17 01:17:13
【问题描述】:
文档说连接池也不是为多线程设计的:
在使用连接池时很关键,并且通过扩展,当 使用通过 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()
【问题讨论】:
-
@IljaEverilä,但我仍然不明白这部分:我可以在多个线程中使用相同的连接池吗?
-
现在看来我明白了主要的想法
标签: python multithreading sqlalchemy