令人困惑的是,在下面的代码“ gotProtocol”中传递了回调函数。使用示例服务器程序执行此代码时,它可以使用我们在类greeter中注册的方法“ sendMessage”发送这些字符串。但是如何?
from twisted.internet import reactor
from twisted.internet.protocol import Factory, Protocol
from twisted.internet.endpoints import TCP4ClientEndpoint
class Greeter(Protocol):
def sendMessage(self, msg):
self.transport.write("MESSAGE %s\n" % msg)
class GreeterFactory(Factory):
def buildProtocol(self, addr):
return Greeter()
def gotProtocol(p):
p.sendMessage("Hello")
reactor.callLater(1, p.sendMessage, "This is sent in a second")
reactor.callLater(2, p.transport.loseConnection)
point = TCP4ClientEndpoint(reactor, "localhost", 1234)
d = point.connect(GreeterFactory())
d.addCallback(gotProtocol)
reactor.run()
它的异步编程。刚开始时可能会有些混乱。基本思想是定义函数并将它们传递给库,并且它将在需要时执行它们。
gotProtocol
是一个回调函数。addCallback
没有调用它,该函数将作为参数传递并存储以供以后调用。
变量p
表示在扭曲调用独立函数时将传递的值,并将gotProtocol
提供函数上下文(即,您将需要操作某些东西)。
展示一个非常简单的例子
import time
# imagine this function is defined in a library
def libraryfunc(cb):
time.sleep(1)
cb(1)
# your callback function that will be called later by library
def mycb(i):
print "the library returned me %d" % i
libraryfunc(mycb)
您向库传递了一个函数,稍后它将通过调用该函数将返回的内容传递给您。
p
将是一个Greeter
实例。由于Greeter
继承自Protocol
它可用于多态的Protocol
内部被扭曲的对象,但是当你收到它,你可以调用额外的方法具体到Greeter
类sendMessage
,以及从继承的方法Protocol
,将做networky东西如self.transport.write
。
至于如何以及何时Greeter
创建实例。您提供了一个工厂类,该类将返回的实例,Greeter
因此可以在需要时创建该实例,然后在回调中将其返回给您。工厂方法的优点是,只要该类从其可用继承而来,twisted不需要知道其实例化的具体类Protocol
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句