Python 使用Tornado websockets和数据库非阻塞获取数据

Python 使用Tornado websockets和数据库非阻塞获取数据,python,tornado,rethinkdb,rethinkdb-python,Python,Tornado,Rethinkdb,Rethinkdb Python,当我收到来自客户端的消息时,我希望并行运行多个查询,并立即将结果发送给客户端 拦路在下面。计数可能需要几分钟。我希望其他返回更快的查询不会被count查询阻塞 self.write_message({'count': r.db('public').table(message['table']).count().run(conn)}) self.write_message({'rows': r.db('public').table(message['table']).limit(10).run(c

当我收到来自客户端的消息时,我希望并行运行多个查询,并立即将结果发送给客户端

拦路在下面。计数可能需要几分钟。我希望其他返回更快的查询不会被count查询阻塞

self.write_message({'count': r.db('public').table(message['table']).count().run(conn)})
self.write_message({'rows': r.db('public').table(message['table']).limit(10).run(conn)})
我想我需要和的组合

我在想也许答案是把这两行写成这样:

ioloop.IOLoop.current().add_callback(run_query, r.db('public').table(message['table']).count(), 'count', self)
ioloop.IOLoop.current().add_callback(run_query, r.db('public').table(message['table']).limit(10), 'rows', self)
我的运行查询是:

@gen.coroutine
def run_query(query, key, ws):
    conn = yield r.connect(host="localhost", port=28015)
    results = yield query.run(conn)
    ws.write_message({key: results})
tornado.gen
揭示了解决方案:

您还可以生成一个列表或目录的未来,这将开始在 同时并行运行;将提供一份结果列表或记录 全部完成后返回

收益率列表或dict直接具有重要行为-如果任何期货失败,
收益率
将立即返回,并将重新引发异常,无论其他期货是否完成。要绕过它,您可以使用或


注意:我真的不知道RejectionDB是否需要单独的连接,但我想展示一下这个概念。

有什么原因需要在tornado中实现这一点吗?这正是node.js非常擅长的地方。只是因为我觉得Python语言更适合使用。同意。尽管我非常喜欢python,但我已经接受javascript几乎总是实时web应用程序的最佳工具。尽管如此,python可能是,我希望我们将开始看到更多的python解决方案。
# do not forget about this
r.set_loop_type("tornado")

@gen.coroutine
def run_parallel(query, key, ws):
    conn = yield r.connect(host="localhost", port=28015)
    ret = yield {
        'count': r.db('public').table(message['table']).count().run(conn),
        'rows': r.db('public').table(message['table']).limit(10).run(conn)
    }
    ws.write_message(ret)