Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cassandra python驱动程序在回调未按预期工作的情况下执行异步_Python_Cassandra - Fatal编程技术网

Cassandra python驱动程序在回调未按预期工作的情况下执行异步

Cassandra 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驱动程序 以下代码足以在我的机器上重现

我试图使用datastax python驱动程序从Cassandra查询数据。我希望这个查询尽快完成。我使用的是synchronous
session.execute
方法,但我想使用asynchronous
session.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