Cassandra python驱动程序在回调未按预期工作的情况下执行异步
我试图使用datastax python驱动程序从Cassandra查询数据。我希望这个查询尽快完成。我使用的是synchronousCassandra python驱动程序在回调未按预期工作的情况下执行异步,python,cassandra,Python,Cassandra,我试图使用datastax python驱动程序从Cassandra查询数据。我希望这个查询尽快完成。我使用的是synchronoussession.execute方法,但我想使用asynchronoussession.execute\u async方法,因为它不必等待行处理代码完成,因此效率可能会更高 当我尝试使用这种方法时,根据文档,它不起作用。我在Ubuntu 14.0.4上使用Cassandra 2.1.3和v2.5 Cassandra python驱动程序 以下代码足以在我的机器上重现
session.execute
方法,但我想使用asynchronoussession.execute\u async
方法,因为它不必等待行处理代码完成,因此效率可能会更高
当我尝试使用这种方法时,根据文档,它不起作用。我在Ubuntu 14.0.4上使用Cassandra 2.1.3和v2.5 Cassandra python驱动程序
以下代码足以在我的机器上重现该问题:
def print_row_count(rows, label):
for i, row in enumerate(rows):
do_something = row
print "{}: processed {} rows".format(label, i+1)
def print_err(reason):
print "Error: {}".format(reason)
cluster = Cluster(['192.168.1.100'])
session = cluster.connect()
session.set_keyspace("foo")
session.default_fetch_size = 200
future_res = session.execute_async("SELECT * FROM bar LIMIT 1000;")
future_res.add_callback(print_row_count, 'Async')
future_res.add_errback(print_err)
当我执行此代码时,不会打印任何内容
但是,当我添加到对ResponseFuture.result
的阻塞调用中时,同步调用将与原始异步调用一样执行
block_future_res = future_res.result()
print_row_count(block_future_res, 'BlockFuture')
运行后输出,添加以下两行:
Async: processed 200 rows
Async: processed 200 rows
Async: processed 200 rows
Async: processed 200 rows
Async: processed 200 rows
BlockFuture: processed 1000 rows
也许我误解了回调系统的工作原理,但我看不到在任何地方需要首先调用result()
才能执行回调
谢谢你的帮助
更新:
关于回调行为的最初问题由@WangST回答
但是,我希望能够通过异步_执行进行分页,以下代码允许这样做:
future = session.execute_async("SELECT * FROM metadata LIMIT 1000;")
future.add_callback(print_row_count, 'Async')
future.add_errback(print_err)
# Call this once so that the future has_more_pages value is set
future_res = future.result()
while future.has_more_pages:
future.start_fetching_next_page()
future_res = future.result()
没有:
block_future_res = future_res.result()
主线程无事可做,在
execute\u async()
query完成之前退出。所以没有打印任何内容。Ok,主线程退出是有意义的,因为这些回调发生在另一个线程上。不确定为什么只有行block\u future\u res=future\u res.result()
时,异步处理的200行代码只执行一次,但在包含下一行时执行5次:print\u row\u count(block\u future\u res,'BlockFuture')
。这是在告诉我应该只使用PagedResult,否则我仍然不知道如何正确地使用execute\u async处理多个页面的结果。我真正想说的是,我希望使用execute\u async可以对结果进行分页,还是应该坚持执行并使用to PagedResult类来处理分页?感谢SQL语句limit1000
将记录限制为1000。如果您想要多页的结果,也许可以将另一个异步SQL查询作为前一页的未来添加到前一页,如future\u res.add\u callback(session.execute\u async(“…”)
。SQL查询处于一个链中,如果成功,它将继续,或者将执行print\u err
。