Python 链接延迟回调
我试图在AMP客户机中链接延迟,如下所示: 客户:Python 链接延迟回调,python,twisted,deferred,asynchronous-messaging-protocol,Python,Twisted,Deferred,Asynchronous Messaging Protocol,我试图在AMP客户机中链接延迟,如下所示: 客户: from twisted.internet.endpoints import TCP4ClientEndpoint, connectProtocol from twisted.protocols.amp import AMP import commands def connect_protocol(host, port): destination = TCP4ClientEndpoint(reactor, host, port)
from twisted.internet.endpoints import TCP4ClientEndpoint, connectProtocol
from twisted.protocols.amp import AMP
import commands
def connect_protocol(host, port):
destination = TCP4ClientEndpoint(reactor, host, port)
d = connectProtocol(destination, AMP())
def connect(protocol):
print 'Connecting to server as Mr Spaceman...'
return protocol.callRemote(commands.Connect,
username='Mr Foo')
def say(protocol):
print 'Saying "Hello world" to the server...'
return protocol.callRemote(commands.Say,
phrase='Hello world')
d.addCallback(connect)
d.addCallback(say)
def main(host, port):
connect_protocol(host, port)
print 'Connected to %s:%d...' % (host, port)
reactor.run()
main('127.0.0.1', 12345)
服务器:
from twisted.internet.protocol import Factory
from twisted.protocols.amp import AMP
import commands
class CommandProtocol(AMP):
def connect(self, username):
print "Received connect command: %s." % (username)
return {}
commands.Connect.responder(connect)
def say(self, phrase):
print "Received phrase \"%s\"." % phrase
return {}
commands.Say.responder(say)
def main(port):
factory = Factory()
factory.protocol = CommandProtocol
reactor.listenTCP(port, factory)
print 'Started AMP server on port %d...' % port
reactor.run()
main(12345)
服务器端只触发了connect()
首先,启用日志记录:
from sys import stdout
from twisted.python.log import startLogging
startLogging(stdout)
现在您将看到程序中发生了什么
其次,至少要有一个最终的errback,该errback将未处理的故障记录在一个延迟的
上,这样这些故障将决定性地显示出来,而不是取决于垃圾收集器:
from twisted.python.log import err
...
d.addCallback(connect)
d.addCallback(say)
d.addErrback(err, "connect_protocol encountered some problem")
最后,延迟的结果通过回调和附加到它的errback进行更改。在这种情况下,传递给say的参数是由connect
返回的延迟的
的结果。这与connect
的参数不同,因此不太可能对其使用callRemote
你可以用很多不同的方法来解决这个问题。一种涉及最少代码更改的方法(但不一定是最佳解决方案)是在连接的结果中将协议作为额外值传递:
def connect(protocol):
print 'Connecting to server as Mr Spaceman...'
d = protocol.callRemote(commands.Connect, username='Mr Foo')
d.addCallback(lambda result: (protocol, result))
return d
def say((protocol, result)):
print 'Saying "Hello world" to the server...'
return protocol.callRemote(commands.Say,
phrase='Hello world')
首先,启用日志记录:
from sys import stdout
from twisted.python.log import startLogging
startLogging(stdout)
现在您将看到程序中发生了什么
其次,至少要有一个最终的errback,该errback将未处理的故障记录在一个延迟的
上,这样这些故障将决定性地显示出来,而不是取决于垃圾收集器:
from twisted.python.log import err
...
d.addCallback(connect)
d.addCallback(say)
d.addErrback(err, "connect_protocol encountered some problem")
最后,延迟的结果通过回调和附加到它的errback进行更改。在这种情况下,传递给say
的参数是由connect
返回的延迟的
的结果。这与connect
的参数不同,因此不太可能对其使用callRemote
你可以用很多不同的方法来解决这个问题。一种涉及最少代码更改的方法(但不一定是最佳解决方案)是在连接的结果中将协议作为额外值传递:
def connect(protocol):
print 'Connecting to server as Mr Spaceman...'
d = protocol.callRemote(commands.Connect, username='Mr Foo')
d.addCallback(lambda result: (protocol, result))
return d
def say((protocol, result)):
print 'Saying "Hello world" to the server...'
return protocol.callRemote(commands.Say,
phrase='Hello world')
d.addCallback(say)
对dict执行callRemote
操作,但如何从同一客户端向同一服务器进行两次不相关的调用(connect
和say
)?d.addCallback(say)
对dict执行callRemote
操作,但是如何从同一个客户端向同一个服务器进行两个不相关的调用(connect
和say
)?