Python асинхронный ожидает при условии, что это правда - PullRequest
3 голосов
/ 04 июня 2019

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

Я могу дождаться завершения запроса путем многократной проверки, но это в основном то же самое, что и блокировка.

def runQuery():
    cursor = hive.connect('localhost').cursor()
    cursor.execute('select * from mytable', async_ = True)
    status = cursor.poll().operationState
    while status in (TOperationState.INITIALIZED_STATE, TOperationState.RUNNING_STATE):
        status = cursor.poll().operationState
    return cursor.fetchall()

Так что я использую async, но тогда я не знаю, как ждать.Я попробовал приведенный ниже код, но он выбрасывает TypeError: object int can't be used in 'await' expression

async def runQueryAsync():
    cursor = hive.connect('localhost').cursor()
    cursor.execute('select * from mytable', async_ = True)
    #THIS DOESN'T WORK 
    await cursor.poll().operationState not in (TOperationState.INITIALIZED_STATE, TOperationState.RUNNING_STATE)
    return cursor.fetchall()

Какие-нибудь обходные пути?По сути, я хочу, чтобы вместо того, чтобы сказать await methodCall, я хотел бы сказать await до тех пор, пока это условие не станет истинным

PS: Чтобы уточнить, cursor.execute('select * from mytable', async_ = True) не является асинхронным в смысле Python по возврату сопрограммы / будущего.Он просто запускает запрос и сразу же возвращается, и вам нужно проверить состояние, чтобы узнать, завершен ли запрос.Так что await cursor.execute('select * from mytable', async_ = True) не сработает.

1 Ответ

1 голос
/ 04 июня 2019

Вы должны были бы активно ждать :

async def runQueryAsync():
    cursor = hive.connect('localhost').cursor()
    await cursor.execute('select * from mytable', async_ = True)
    while cursor.poll().operationState not in (TOperationState.INITIALIZED_STATE, TOperationState.RUNNING_STATE):
        await asyncio.sleep(1) # try each 1 second
    return cursor.fetchall()

Я не уверен, что вы можете await cursor.execute('select * from mytable', async_ = True), но если не просто использовать cursor.execute('select * from mytable', async_ = True), хотя это может сделатьСмысл использовать его там.Если при выполнении он работает с await, вам может не понадобиться использовать цикл while, поскольку он должен продолжаться после завершения выполнения:

async def runQueryAsync():
    cursor = hive.connect('localhost').cursor()
    await cursor.execute('select * from mytable', async_ = True)
    return cursor.fetchall()
...