用扭曲的cassandra python驱动程序

时间:2017-11-22 12:35:01

标签: python-3.x twisted cassandra-3.0 autobahn cassandra-driver

我的python应用程序使用twisted,并在引擎盖下使用cassandra python驱动程序。 Cassandra python驱动程序可以使用cassandra.io.twistedreactor.TwistedConnection作为连接类来使用twisted作为查询方式。

TwistedConnection类使用计时器和reactor.callLater来检查查询任务是否已超时。

问题在于我使用cassandra ORM(cassandra.cqlengine.models.Model)进行查询。

from cassandra.cqlengine import columns
from cassandra.cqlengine.models import Model


# ORM for user settings
class UserSettings(Model):
    userid = columns.Text(primary_key=True)
    settings = columns.Text()

# Function registered with autobahn/wamp
def worker():
    userid = "96c5d462-cf7c-11e7-b567-b8e8563d0920"

    def _query():
        # This is a blocking call, internally calling twisted reactor
        # to collect the query result
        setting = model.UserSettings.objects(userid=userid).get()
        return json.loads(setting.settings)

    threads.deferToThread(_query)

twisted.trial单元测试中运行时。使用上述代码的测试始终以

失败
  

失败:twisted.trial.util.DirtyReactorAggregateError:Reactor是   不洁净的。

DelayedCalls: (set twisted.internet.base.DelayedCall.debug = True to debug)
<DelayedCall 0x10e0a2dd8 [9.98250699043274s] called=0 cancelled=0 TwistedLoop._on_loop_timer()

在使用此代码的高速公路工作人员中工作正常。

TwistedConnection的cassandra驱动程序代码继续调用callLater,我无法找到一种方法来查找这些调用是否还有待处理,因为这些调用隐藏在TwistedLoop类中。

问题:

  • 这是处理cassandra查询的正确方法(反过来会调用twisted reactor)
  • 如果是,是否可以通过cassandra驱动程序超时(DelayedCall)解决reactor.callLater问题。

1 个答案:

答案 0 :(得分:0)

仅是我的理解:

  1. 也许您需要在过滤时调用.filter函数?如docs setting = model.UserSettings.objects.filter(userid=userid).get()

  2. 中所述
  3. 也许可以通过更改Cassandra conf yaml文件中的响应时间来解决此问题?