【问题标题】:Twisted: cache list of instancesTwisted:缓存实例列表
【发布时间】:2018-07-25 19:29:07
【问题描述】:

我目前正在阅读扭曲的开发人员指南,并希望获得一些关于扩展所提供示例之一的用例的信息/指南,即缓存对象实例:

示例代码为:

cache.classes.py

from twisted.spread import pb

class MasterDuckPond(pb.Cacheable):
    def __init__(self, ducks):
        self.observers = []
        self.ducks = ducks

    def count(self):
        print "I have [%d] ducks" % len(self.ducks)

    def addDuck(self, duck):
        self.ducks.append(duck)
        for o in self.observers: o.callRemote('addDuck', duck)

    def removeDuck(self, duck):
        self.ducks.remove(duck)
        for o in self.observers: o.callRemote('removeDuck', duck)

    def getStateToCacheAndObserveFor(self, perspective, observer):
        self.observers.append(observer)
# you should ignore pb.Cacheable-specific state, like self.observers
        return self.ducks # in this case, just a list of ducks

    def stoppedObserving(self, perspective, observer):
        self.observers.remove(observer)

class SlaveDuckPond(pb.RemoteCache):
    # This is a cache of a remote MasterDuckPond

    def count(self):
        return len(self.cacheducks)

    def getDucks(self):
        return self.cacheducks

    def setCopyableState(self, state):
        print " cache - sitting, er, setting ducks"
        self.cacheducks = state

    def observe_addDuck(self, newDuck):
        print " cache - addDuck"
        self.cacheducks.append(newDuck)

    def observe_removeDuck(self, deadDuck):
        print " cache - removeDuck"
        self.cacheducks.remove(deadDuck)
pb.setUnjellyableForClass(MasterDuckPond, SlaveDuckPond)

cache_sender.py

#!/usr/bin/env python
# Copyright (c) Twisted Matrix Laboratories.
# See LICENSE for details.

from twisted.spread import pb, jelly
from twisted.python import log
from twisted.internet import reactor
from cache_classes import MasterDuckPond

class Sender:
    def __init__(self, pond):
        self.pond = pond

    def phase1(self, remote):
        self.remote = remote
        d = remote.callRemote("takePond", self.pond)
        d.addCallback(self.phase2).addErrback(log.err)

    def phase2(self, response):
        self.pond.addDuck("ugly duckling")
        self.pond.count()
        reactor.callLater(1, self.phase3)

    def phase3(self):
        d = self.remote.callRemote("checkDucks")
        d.addCallback(self.phase4).addErrback(log.err)

    def phase4(self, dummy):
        self.pond.removeDuck("one duck")
        self.pond.count()
        self.remote.callRemote("checkDucks")
        d = self.remote.callRemote("ignorePond")
        d.addCallback(self.phase5)

    def phase5(self, dummy):
        d = self.remote.callRemote("shutdown")
        d.addCallback(self.phase6)

    def phase6(self, dummy):
        reactor.stop()

    def main():
        master = MasterDuckPond(["one duck", "two duck"])
        master.count()
        sender = Sender(master)
        factory = pb.PBClientFactory()
        reactor.connectTCP("localhost", 8800, factory)
        deferred = factory.getRootObject()
        deferred.addCallback(sender.phase1)
        reactor.run()

if __name__ == '__main__':
main()

cache_receiver.py:

#!/usr/bin/env python
# Copyright (c) Twisted Matrix Laboratories.
# See LICENSE for details.

from twisted.application import service, internet
from twisted.internet import reactor
from twisted.spread import pb
import cache_classes

class Receiver(pb.Root):
    def remote_takePond(self, pond):
        self.pond = pond
        print "got pond:", pond # a DuckPondCache
        self.remote_checkDucks()

    def remote_checkDucks(self):
        print "[%d] ducks: " % self.pond.count(), self.pond.getDucks()

    def remote_ignorePond(self):
        # stop watching the pond
        print "dropping pond"
        # gc causes __del__ causes 'decache' msg causes stoppedObserving
        self.pond = None

    def remote_shutdown(self):
        reactor.stop()
application = service.Application("copy_receiver")
internet.TCPServer(8800, pb.PBServerFactory(Receiver())).setServiceParent(
service.IServiceCollection(application))

这个例子看起来很简单,MasterDuckPond 由发送方控制,而 SlaveDuckPond 是一个缓存,用于跟踪对 master 的更改。

但是,我将如何更新/缓存整个实例对象列表?

【问题讨论】:

    标签: python python-3.x twisted


    【解决方案1】:

    不要使用 PB。对于至少 99% 的用例而言,该协议过于复杂(这意味着您必须比理解、实施和维护您的项目所需的工作更加努力)。它没有其他实现,可能永远不会有(这意味着你被 Python 和 Twisted 困住了——这并不是说这些东西不好,但还有很多其他的东西也可能是好的)。维护水平很低(因此,如果您发现错误,那么有人会帮助您修复它们的可能性很小,但这就是您所能期望的 - 如果错误不是微不足道的,您甚至可能无法做到这一点)。

    试试 HTTP。它可以做很多事情。如果将它与 Capn、CBOR 甚至 JSON 等数据格式结合起来,它可以做得更多。

    【讨论】:

    • 感谢您的回复,但是,我并不是专门研究 PB,这只是扭曲的开发人员指南中给出的一个示例,我想了解更多信息。
    • 好的,很高兴听到。我不确定如何以超越 PB 的方式回答您的问题。我认为这严格来说是一个关于 PB 的功能和用法的问题。所以我想我会坚持我的回答(或者不回答,如果你愿意的话)。
    • 因为我只是在寻找一个特定于这个例子的解决方案,所以我不介意一个适合 PB 甚至只是这个例子的答案,否则我会自己修补。不过感谢您的回答,在任何实际应用中使用 PB 之前,我都会三思而后行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 2017-05-14
    相关资源
    最近更新 更多