gpt4 book ai didi

python - SimpleConnectionPool 与 ThreadedConnectionPool : what it means to be thread safe?

转载 作者:行者123 更新时间:2023-12-04 04:05:03 31 4
gpt4 key购买 nike

我想弄清楚 SimpleConnectionPool 之间的区别和 ThreadedConnectionPool在 psycopg2 连接池中。
doc说:SimpleConnectionPool连接只能在单线程应用程序/脚本中使用。ThreadedConnectionPool连接可以是安全 在多线程应用程序/脚本中使用。
什么safely这里的意思?
我的理解/困惑:


"""
eg1: Simple Connection Pooling example
"""

from psycopg2.pool
from concurrent.futures

def someTask(id):
# CRUD queries to Postgres, that I will be multithreading
print(f"Thread: {id}")
conn = simple_pool.getconn()
# do DB operation


simple_pool = psycopg2.pool.SimpleConnectionPool(10, 15, #DB Info)

with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
executor.map(someTask, range(1,10))


"""
eg2: Threaded Connection Pooling example
"""

from psycopg2.pool
from concurrent.futures

def someTask(id):
# CRUD queries to Postgres, that I will be multithreading
print(f"Thread: {id}")
conn = threaded_pool.getconn()
# do DB operation


threaded_pool = psycopg2.pool.ThreadedConnectionPool(10, 15, #DB Info)

with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
executor.map(someTask, range(1,10))

Q1:我可能理解错误,但在 eg1 中 someTask()函数将被每个线程调用,所以如果它是简单的连接池,这将出错/将是 不安全 (这是什么意思?)。
Q2: 而在 eg2 中,如果例子很好,什么 线程安全 意味着, someTask()函数将被允许从池中获取连接,而在 eg1 中它不会?
Q3:两者有性能差异吗?
我可以阅读任何其他资源/文章/文本以更好地理解这一点,非常感谢。谢谢你。

最佳答案

根据documentationSimpleConnectionPool ,定义为:

A connection pool that can’t be shared across different threads


这证实了您在第一个问题中所说的话。即使它运行没有错误,使用 SimpleConnectionPool由于线程之间的竞争条件,在多个线程中并发可能会导致未定义的行为/错误的结果。
至于你的第二个问题,线程安全意味着一个对象可以被多个线程同时使用,而无需处理竞争条件。如果您按照 implementation 操作,您会发现情况就是如此。的 ThreadedConnectionPool .使用锁来确保两个线程不会同时共享任何连接。
我无法评论两者之间的性能差异,因为它们具有不同的用例。

关于python - SimpleConnectionPool 与 ThreadedConnectionPool : what it means to be thread safe?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62647530/

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