gpt4 book ai didi

python-3.x - 在线程中使用 psycopg2 游标的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-04 13:11:38 26 4
gpt4 key购买 nike

我觉得我的问题的答案就在这两个 SO 问题中,但我发现答案措辞很差(或高于我的工资等级)

  • multi thread python psycopg2
  • Are transactions in PostgreSQL via psycopg2 per-cursor or per-connection?

  • 问题:使用 psycopg2 确保线程安全的正确方法是什么
    选项 1:每个线程都有自己的游标
    import threading
    import psycopg2

    conn = psycopg2.connect (
    host=127.0.0.1,
    user='john',
    password='1234',
    dbname='foo',
    port=1234)

    class Foo (threading.Thread):
    def __init__ (self):
    threading.Thread.__init__(self)

    def run (self):
    global conn

    cur = conn.cursor()
    sql_query="SELECT * from foo;"
    print(cur.execute (sql_query))
    conn.commit()

    num_threads = 100
    threads = []

    for i in seq (num_threads):
    threads.append (Foo())

    for i in seq (num_threads):
    threads[i].start()

    for i in seq (num_threads):
    threads[i].join()
    选项 2:每个线程都有自己的连接
    import threading
    import psycopg2

    db_conn = psycopg2.connect (
    host=127.0.0.1,
    user='john',
    password='1234',
    dbname='foo',
    port=1234)

    class Foo (threading.Thread):
    def __init__ (self):
    threading.Thread.__init__(self)
    self.conn = psycopg2.connect (
    host=127.0.0.1,
    user='john',
    password='1234',
    dbname='foo',
    port=1234)

    def run (self):
    cur = self.conn.cursor()
    sql_query="SELECT * from foo;"
    print(cur.execute (sql_query))
    conn.commit()

    num_threads = 100
    threads = []

    for i in seq (num_threads):
    threads.append (Foo())

    for i in seq (num_threads):
    threads[i].start()

    for i in seq (num_threads):
    threads[i].join()

    最佳答案

    每个线程都应该有自己的数据库连接。
    一个 PostgreSQL 连接在给定时间只能处理一个语句(除非您使用的是 server side cursor ,但即使如此,该连接也只能同时处理一个 FETCH)。
    因此,如果多个线程要共享一个数据库连接,则它们必须仔细协调以确保只有一个线程同时使用该连接。例如,当另一个线程仍在等待查询结果时,您不能发送新查询。

    关于python-3.x - 在线程中使用 psycopg2 游标的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64602183/

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