我的 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:反应堆不干净。
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 查询的正确方法吗(这又称为扭曲反应器)
- 如果是,有没有办法解决
DelayedCall
由 cassandra 驱动程序超时 (reactor.callLater
) 导致的问题。