`
cooldesigner
  • 浏览: 68249 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

Twisted 学习笔记-Event loop

阅读更多

        Twisted 是用Python编写的开源的 framework,它基于事件-驱动模式,高效、简洁的实现了非阻塞方式的网络编程。在Twisted中有个event loop,被称为事件管理,当其运行时,它就开始侦听各种事件的发生,并启动事件的响应函数。Twisted默认对事件不做任何处理,如果你添加了某个事件的处理函数,那就遵循你的处理过程了,是不是很简单。

在Twisted中的event loop,就是reactor对象了,reactor对象处理许多重要的任务:如: scheduling, threading, 建立网络连接,侦听客户端的连接等等, 如果想要reactor处理上述事件,则只要运行reactor.run()即可。

 例如:下面的一个例子

from twisted.internet import reactor    #导入reactor模块

print "Runing the reactor..."

reactor.run() #运行reactor,进入Twisted的事件循环管理

print "reactor stopped."

上面的代码什么也不做,因为我们没有添加任何的事件处理函数,如果不调用reactor.stop(),则程序一直处于接受事件的过程中,或者键入Ctrl-C组合键来强制关闭程序。下面再写个例子,该例子调用reactor.callLater()函数,这个函数的作用是告诉reactor我要在将来某个时间里,执行哪些工作,类似于计划任务。该函数有两个参数,第一个参数为要等待的秒数,第二个是要运行的函数名称,如果该函数有参数,则可以填写传递的参数:如:reactor.callLater(10,func,True,x=2) ,func为函数名称,True和x=2为func函数的参数。

from twisted.internet import reactor
import time
def printTime():
    print "Current tim is",time.strftime("%H:%M:%S")

def stopReactor():
    print "stopping reactor"
    reactor.stop()


reactor.callLater(1,printTime)      #1秒后执行printTime函数
reactor.callLater(10,printTime)   #10秒后再执行printTime函数
reactor.callLater(15,stopReactor)   #15秒后执行stopReactor函数,在退出event loop。
print "Running the reactor..."
reactor.run()
print "Rector stopped."

 所有的网络通讯,必须建立在两台计算机建立连接通道的情况下,进行数据传输,那么在Twisted中如何建立呢?其实Twisted都已经封装了网络通讯的底层协议,我们只要调用reactor.connectTCP()方法即可,该方法有3个参数,第一个是需要连接的主机,第二个是端口号,第三个是一个ClientFactory 对象,该ClientFactory对象负责建立网络连接后的工作,看下面的例子:

from twisted.internet import reactor,protocol

class QuickDisconnectProtocol(protocol.Protocol):
    def connectionMade(self):     #---重载了Protocol的connectionMade()方法,该事件在连接成功后出现
        print 'Connected to %s.' % self.transport.getPeer().host
        self.transport.loseConnection()   #---

class BasicClientFactory(protocol.ClientFactory):
    protocol=QuickDisconnectProtocol   # --设置protocol属性为自定义的QuickDisconnectProtocol
    def clientConnectionLost(self,connector,reason):  #--重载了clientConnectionLost方法,该事件在已经建立的通道端口或关闭的情况下触发。
        print 'Lost connection:%s' % reason.getErrorMessage()
        reactor.stop()
    def clientConnectionFailed(self,connector,reason):  #--也是重载了clientConnectionFailed方法,该事件在无法建立通道的情况下触发。
        print 'Connection failed:%s' % reason.getErrorMessage()
        reactor.stop()
reactor.connectTCP('www.comeinfo.com',80,BasicClientFactory())
reactor.run()

上面定义了两个类,分别继承自ClientFactory 和 Protocol类,这两个类处理连接中所有可能发生的事件:成功建立连接、连接失败、连接断开、数据传送等等。<o:p></o:p>ClientFactory类负责管理连接通道的各种事件,一旦通道建立成功,则ClientFactory就会自动创建一个Protocol对象来处理每一个成功的连接,该Protocol对象就可以在该通道上进行数据传输等各种工作,如数据的接受、发送,是否关闭连接等。

twisted中定义了多个事件的原型,在程序中只要重载需要的方法,即可完成事件-驱动模式的编写,编写起来和delphi以及其他RAD 一样。

分享到:
评论
1 楼 renyangok 2007-04-16  
不错不错,不过twisted笔记太少了

相关推荐

Global site tag (gtag.js) - Google Analytics