[Twisted-Python] AMP with a long-lived connection - results and deferred?

Oon-Ee Ng ngoonee.talk at gmail.com
Thu Oct 29 02:03:50 MDT 2015


Hmm, I'm wondering whether this could be specific to the reactor I'm
using (a _threadedselect reactor embedded in Kivy). I wrote up a
minimal example of what I'm doing to demonstrate the issue, but this
example works! Doesn't in my (admittedly quite a bit more complex)
kivy example though. Let me try for a minimal example there and see if
I can figure it out.

from twisted.internet import reactor, protocol
from twisted.internet.task import deferLater
from twisted.protocols import amp
from ampserver import Sum, Divide


connection = None

class MathClient(amp.AMP):
    def connectionMade(self):
        global connection
        connection = self


class MathFactory(protocol.ReconnectingClientFactory):
    protocol = MathClient


if __name__ == '__main__':
    reactor.connectTCP('127.0.0.1', 1234, MathFactory())
    def simpleSum():
        global connection
        d = connection.callRemote(Sum, a=1, b=5)
        def prin(result):
            print(result)
        d.addCallback(prin)
        return d
    deferLater(reactor, 1, simpleSum)
    deferLater(reactor, 3, simpleSum)
    deferLater(reactor, 6, simpleSum)
    deferLater(reactor, 9, simpleSum)
    deferLater(reactor, 12, simpleSum)
    deferLater(reactor, 15, simpleSum)
    deferLater(reactor, 18, simpleSum).addCallback(lambda _: reactor.stop())
    reactor.run()

On Thu, Oct 29, 2015 at 3:37 PM, Oon-Ee Ng <ngoonee.talk at gmail.com> wrote:
> Thanks David, but when I do something along the lines of:-
>
> def mycall(in):
>     print(in)
> d = self.connection.boxReceiver.callRemote(Command, a='test')
> d.addCallBack(mycall)
>
> The print never actually happens. I'm not really sure why, it was one
> of the first things I tried. I tried the most basic thing, modifying
> the doMath() example, and mycall only triggers when the reactor stops
> (even if I run doMath multiple times with delays).
>
> On Thu, Oct 29, 2015 at 1:15 PM, David Ripton <dripton at ripton.net> wrote:
>> On 10/28/2015 02:24 AM, Oon-Ee Ng wrote:
>>> Working off the example ampserver.py and ampclient.py examples, I
>>> wanted to build a client which maintains a single connection while
>>> allowing the passing of messages back and forth. However I'm stuck at
>>> one of the most basic steps, getting back the result (without
>>> 'completing' the connection).
>>>
>>> The ampclient.py example simply connects, does a callRemote on the
>>> resulting protocol, and adds callbacks to extract the result from a
>>> dictionary and print it. The deferred being used in this case is
>>> produced by connectProtocol.
>>>
>>> I'm trying to write a client (inheriting from amp.AMP) which is
>>> embedded in a kivy GUI, something which is quite possible using the
>>> _threadedselect reactor.
>>>
>>> On connection, I use the connectionMade method to save the 'self' (in
>>> this case, the client inheriting from amp.AMP) in my kivy app. I can
>>> then call a function which does a callRemote on this saved client,
>>> which indeed triggers the server appropriately.
>>>
>>> The callRemote returns a deferred (from reading docs online, a remote
>>> reference). I can't figure out what to do with it, specifically in
>>> terms of getting the result ('total', when calling Sum from
>>> ampserver.py).
>>>
>>> Assistance much appreciated.
>>
>> Basically, callRemote returns a deferred, that you can add callbacks and
>> errbacks to, which will be called when the remote call succeeds or
>> fails.  On success, the callback will receive an argument equal to the
>> return value of the remote callable that you called.  On failure, the
>> errback will receive an error argument.
>>
>> I have an old GUI (PyGTK, not Kivy) chat over AMP example at
>> https://github.com/dripton/ampchat that might help you.  (Though I think
>> all of my commands return boring responses.)
>>
>> --
>> David Ripton    dripton at ripton.net
>>
>> _______________________________________________
>> Twisted-Python mailing list
>> Twisted-Python at twistedmatrix.com
>> http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python




More information about the Twisted-Python mailing list