Python SimpleConnectionPool vs ThreadedConnectionPool:线程安全意味着什么?

Python SimpleConnectionPool vs ThreadedConnectionPool:线程安全意味着什么?,python,python-3.x,psycopg2,python-multithreading,Python,Python 3.x,Psycopg2,Python Multithreading,我试图找出psycopg2连接池中的SimpleConnectionPool和ThreadedConnectionPool之间的区别 上面写着: SimpleConnectionPool连接只能在单线程应用程序/脚本中使用。 ThreadedConnectionPool可以在多线程应用程序/脚本中安全地使用连接 这里的安全是什么意思 我的理解/困惑: """ eg1: Simple Connection Pooling example ""&q

我试图找出psycopg2连接池中的
SimpleConnectionPool
ThreadedConnectionPool
之间的区别

上面写着:
SimpleConnectionPool
连接只能在单线程应用程序/脚本中使用。
ThreadedConnectionPool
可以在多线程应用程序/脚本中安全地使用连接

这里的
安全
是什么意思

我的理解/困惑:


"""
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))

Q1:我可能理解不正确,但在eg1中,每个线程都会调用
someTask()
函数,因此如果它的简单连接池出现错误,则这将是不安全的(这是什么意思?)

问题2:在eg2中,如果示例是好的,线程安全的意味着什么,
someTask()
函数将允许从池中获取连接,而在eg1中则不允许

问题3:两者之间有什么性能差异吗

如果我能阅读更多的资源/文章/文本来更好地理解这一点,我将不胜感激。谢谢。

根据
SimpleConnectionPool
的定义,它被定义为:

无法跨不同线程共享的连接池

这证实了你在第一个问题中所说的。即使它在没有错误的情况下运行,在多个线程中同时使用
SimpleConnectionPool
可能会由于线程之间的争用条件而导致未定义的行为/错误的结果

至于第二个问题,线程安全意味着一个对象可以由多个线程并发使用,而无需处理争用条件。如果遵循
ThreadedConnectionPool
的步骤,您可以看到这种情况。使用锁来确保两个线程不会同时共享任何连接

我不能评论两者在性能上的差异,因为它们有不同的用例

Q1:我可能理解不正确,但在eg1中someTask()是 函数将按线程调用,因此如果它的简单连接池, 这将出错/不安全(这意味着什么?)

  • 是的,将在每个工作线程中调用someTask,并且将
    SimpleConnectionPool
    ThreadPoolExecutor
    一起使用不是一个好主意,因为
    ThreadPoolExecutor
    将是一个调用
    someTask
    的多线程执行器
  • 因此,eg1肯定是线程不安全的,因为它使用线程作为其设计的一个主要方面
问题2:在eg2中,如果示例很好,那么线程安全意味着什么 someTask()函数将被允许从中获取连接 在eg1中它不会游泳吗

  • 本质上,这意味着,在连接池方面,您的每个员工都知道如何友好相处

  • 辅助进程A不会开始使用池中的连接,只会被辅助进程B中断

  • 工人A、B、C。。。将在一个有序且“友好”的庄园中与连接池连接,如果需要,等待轮到他们

问题3:两者之间有什么性能差异吗

  • 是的,基于您所寻找的,eg1肯定不会工作
  • Eg2利用线程安全连接池的线程,它的工作人员可以同时工作,而单线程解决方案需要更多的时间
这两种解决方案,如果正确实现,都会有很好的性能,单线程和多线程方法之间的唯一区别是时间,以及在任何给定时刻消耗的资源

我希望这有助于澄清问题,也可以查看这些关于这个主题的帖子,以及


"""
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))