Драйвер Cassandra не поддерживает режим ожидания / асинхронности для запроса данных, просто режим обратного вызова реализован в list_async
. Таким образом, согласно странице часто задаваемых вопросов торнадо (https://www.tornadoweb.org/en/stable/faq.html), я использовал следующий код для использования режима execute_async
в await
:
async def execute_query_async(session, query):
response_future = session.execute_async(query)
future = Future()
response_future.add_callbacks(future.set_result, future.set_exception)
return await future
async def list_async(session, *args, **kwargs):
query = "select * from users limit 10"
result = await execute_query_async(session, query=query)
return result
Работает в режиме отладки, если строка return await future
приостановлена на некоторое время, в противном случае возникнет исключение '_asyncio.FutureIter' object is not callable
.
Я написал пример метода с обратным вызовом, отличным от метода списка драйверов Cassandra, но у него та же проблема:
def sleep_callback(duration, callback):
time.sleep(duration)
callback('hello')
def do_something_with_callback(callback):
_thread.start_new_thread ( sleep_callback, (1, callback))
async def get_one(self, id):
import tornado.concurrent
io_loop = IOLoop.current()
results = []
f = tornado.concurrent.Future()
do_something_with_callback(f.set_result)
results.append(await f)
return results