Преобразование обратного вызова в ожидаемый объект в Python 3 - PullRequest
0 голосов
/ 17 июня 2019

Драйвер 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
...