Ошибка Python: выполнение не может использоваться во время выполнения асинхронного запроса

Как предотвратить ошибку"ProgrammingError: execute cannot be used while an asynchronous query is underway"? Из документов говорится, что я должен использовать psycopg2.дополнительный.wait_select если я использую поддержку сопрограмм как gevent. но я все еще получаю эту ошибку, когда я использую его. Я выделил ошибку, которую я получаю в приведенном ниже фрагменте.

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 ответов


вы пытаетесь сделать более одной транзакции одновременно на одном соединении. В psycopg документация говорит, что это не является потокобезопасным и приведет к ошибке. Раздел асинхронная поддержка и поддержка библиотек coroutine

одним из возможных решений является использование одного подключения к базе данных, каждый с одним курсором, в сопрограмма (4 отдельных соединений и курсоры в данном случае).