Python错误:异步查询正在进行时无法使用execute

时间:2015-04-25 18:37:38

标签: python psycopg2 gevent

如何防止错误“ProgrammingError: execute cannot be used while an asynchronous query is underway”?从文档中可以看出,如果我使用像gevent这样的协程支持,我应该使用psycopg2.extras.wait_select,但是当我使用它时我仍然会遇到错误。我已经在下面的代码片段中找到了错误。

con = psycopg2.connect(database=DATABASE_NAME, user=DATABASE_USERNAME)

def execute_query(cur, query, params):
    psycopg2.extras.wait_select(con)
    cur.execute(query, params)
    psycopg2.extras.wait_select(con)
    rows = cur.fetchall()
    print rows[0]

cur = con.cursor()
query = "SELECT * FROM mytable"
gevent.joinall([
     gevent.spawn(execute_query, cur, query, None),
     gevent.spawn(execute_query, cur, query, None),
     gevent.spawn(execute_query, cur, query, None),
     gevent.spawn(execute_query, cur, query, None)
])

1 个答案:

答案 0 :(得分:7)

您尝试在单个连接上同时执行多个事务。 psycopg文档说这不是线程安全的,会导致错误。见Asynchronous support and Support for coroutine libraries

一种可能的解决方案是使用一个数据库连接,每个数据库连接一个游标,每个协程(在这种情况下有4个不同的连接和游标)。