gpt4 book ai didi

python - py-postgresql多线程问题

转载 作者:太空宇宙 更新时间:2023-11-03 11:33:20 25 4
gpt4 key购买 nike

我发现在重负载下我的 Pyramid 网络应用抛出py-postgresql 异常,如 postgresql.exceptions.ProtocolError。一些搜索显示,py-postgresql 不是线程安全的,并且有一个连接不能被多个线程同时使用。

我试图建立某种池化机制,但我仍然得到协议(protocol)错误:(

我做错了什么?

首先我创建了一些连接对象:

    for x in range(num_db_connections):
self.pool.append(Connection(conn_string,x))

池中的每个对象都包含db_lock = threading.Lock() 和一个到数据库的连接self.conn = postgresql.open(conn_string)

然后我尝试获取连接上的锁并使用它做一些工作。这段代码可以由多个线程同时执行,但我认为不两个线程可以同时在一个连接上运行 work 因为锁。

    time_start = time.time()
while time.time() - time_start < self.max_db_lock_wait_time:
for conn in self.pool:
acquired = conn.db_lock.acquire(False)
if acquired:
try:
lst = conn.work()
finally:
conn.db_lock.release()
return lst
time.sleep(0.05)
raise Exception('Could not get connection lock in time')

也许我的代码有缺陷,或者我误解了py-postgresql 的“线程不安全”?请帮帮我!

最佳答案

您确定您没有在锁外使用游标对象吗?

只是一个建议:不要使用 time.sleep() 和“尝试”锁定,而是使用队列将连接对象从池中弹出/推送到池中。这已经是线程安全的,并且它有一个超时参数。更有效。特别是如果你有很多线程而只有几个连接。 (当您需要运行 100 000 个查询时,这些微小的 sleep 指令加起来。所有这些都会增加您的响应时间。)

关于python - py-postgresql多线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12612572/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com