Я пытаюсь написать асинхронный метод для выполнения запроса в кусте (с помощью 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)
не сработает.