2015-04-25 3 views
6

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

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

ответ

6

Вы пытаетесь совершить несколько транзакций одновременно на одном соединении. Документация psycopg гласит, что это не потокобезопасно и приведет к ошибке. См. Ниже Asynchronous support and Support for coroutine libraries

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

+0

Итак, я попробовал ваше предложение и создал курсор в методе 'execute_query', и я все равно получаю ту же ошибку. – User134

+0

Вы пробовали одно соединение, как в примере кода, или четыре соединения/курсоры (по одному на каждую сопрограмму)? – paisanco

+0

Ох. Виноват. С четырьмя соединениями ошибка исчезает. Но меня интересует эффективность использования нового соединения каждый раз, когда я хочу сделать один запрос. – User134