等待数据库未来完成?
Wait for db future to complete?
我写了sanic应用程序的代码,rethinkdb被用作后端数据库。我想等待 rethinkdb 连接函数在其他函数之前初始化,因为它们依赖于 rethinkdb 连接。
我的rethinkdb连接初始化函数是:
async def open_connections(app):
logger.warning('opening database connection')
r.set_loop_type('asyncio')
connection= await r.connect(
port=app.config.DATABASE["port"],
host=app.config.DATABASE["ip"],
db=app.config.DATABASE["dbname"],
user=app.config.DATABASE["user"],
password=app.config.DATABASE["password"])
print (f"connection established {connection}")
return connection
future解析后执行的回调函数是
def db_callback(future):
exc = future.exception()
if exc:
# Handle wonderful empty TimeoutError exception
logger.error(f"From mnemonic api isnt working with error {exc}")
sys.exit(1)
result = future.result()
return result
健全的应用程序:
def main():
app = Sanic(__name__)
load_config(app)
zmq = ZMQEventLoop()
asyncio.set_event_loop(zmq)
server = app.create_server(
host=app.config.HOST, port=app.config.PORT, debug=app.config.DEBUG, access_log=True)
loop = asyncio.get_event_loop()
##not wait for the server to strat, this will return a future object
asyncio.ensure_future(server)
##not wait for the rethinkdb connection to initialize, this will return
##a future object
future = asyncio.ensure_future(open_connections(app))
result = future.add_done_callback(db_callback)
logger.debug(result)
future = asyncio.ensure_future(insert_mstr_account(app))
future.add_done_callback(insert_mstr_acc_callback)
future = asyncio.ensure_future(check_master_accounts(app))
future.add_done_callback(callbk_check_master_accounts)
signal(SIGINT, lambda s, f: loop.close())
try:
loop.run_forever()
except KeyboardInterrupt:
close_connections(app)
loop.stop()
当我启动这个应用程序时,open_connections 函数中的打印语句在最后执行。
future = asyncio.ensure_future(open_connections(app))
result = future.add_done_callback(db_callback)
ensure_future
并发调度协程
add_done_callback
不等待 future 完成,而是在 future 完成后简单地安排一个函数调用。可以看看here
所以你应该在执行其他功能之前明确地 await open_connections
未来:
future = asyncio.ensure_future(open_connections(app))
future.add_done_callback(db_callback)
result = await future
已编辑:以上答案仅适用于协程
在这种情况下,我们要等待函数体中的 future 完成。为此,我们应该使用 loop.run_until_complete
def main():
...
future = asyncio.ensure_future(open_connections(app))
future.add_done_callback(db_callback)
result = loop.run_until_complete(future)
我写了sanic应用程序的代码,rethinkdb被用作后端数据库。我想等待 rethinkdb 连接函数在其他函数之前初始化,因为它们依赖于 rethinkdb 连接。
我的rethinkdb连接初始化函数是:
async def open_connections(app):
logger.warning('opening database connection')
r.set_loop_type('asyncio')
connection= await r.connect(
port=app.config.DATABASE["port"],
host=app.config.DATABASE["ip"],
db=app.config.DATABASE["dbname"],
user=app.config.DATABASE["user"],
password=app.config.DATABASE["password"])
print (f"connection established {connection}")
return connection
future解析后执行的回调函数是
def db_callback(future):
exc = future.exception()
if exc:
# Handle wonderful empty TimeoutError exception
logger.error(f"From mnemonic api isnt working with error {exc}")
sys.exit(1)
result = future.result()
return result
健全的应用程序:
def main():
app = Sanic(__name__)
load_config(app)
zmq = ZMQEventLoop()
asyncio.set_event_loop(zmq)
server = app.create_server(
host=app.config.HOST, port=app.config.PORT, debug=app.config.DEBUG, access_log=True)
loop = asyncio.get_event_loop()
##not wait for the server to strat, this will return a future object
asyncio.ensure_future(server)
##not wait for the rethinkdb connection to initialize, this will return
##a future object
future = asyncio.ensure_future(open_connections(app))
result = future.add_done_callback(db_callback)
logger.debug(result)
future = asyncio.ensure_future(insert_mstr_account(app))
future.add_done_callback(insert_mstr_acc_callback)
future = asyncio.ensure_future(check_master_accounts(app))
future.add_done_callback(callbk_check_master_accounts)
signal(SIGINT, lambda s, f: loop.close())
try:
loop.run_forever()
except KeyboardInterrupt:
close_connections(app)
loop.stop()
当我启动这个应用程序时,open_connections 函数中的打印语句在最后执行。
future = asyncio.ensure_future(open_connections(app))
result = future.add_done_callback(db_callback)
ensure_future
并发调度协程
add_done_callback
不等待 future 完成,而是在 future 完成后简单地安排一个函数调用。可以看看here
所以你应该在执行其他功能之前明确地 await open_connections
未来:
future = asyncio.ensure_future(open_connections(app))
future.add_done_callback(db_callback)
result = await future
已编辑:以上答案仅适用于协程
在这种情况下,我们要等待函数体中的 future 完成。为此,我们应该使用 loop.run_until_complete
def main():
...
future = asyncio.ensure_future(open_connections(app))
future.add_done_callback(db_callback)
result = loop.run_until_complete(future)