您的位置:首页 > 其它

事件驱动模型

2017-03-08 16:50 197 查看

事件驱动

事件驱动初了解:

通常,我们写服务器处理模型的程序时,有以下几种模型:
  (1)每收到一个请求,创建一个新的进程,来处理该请求;
  (2)每收到一个请求,创建一个新的线程,来处理该请求;
  (3)每收到一个请求,放入一个事件列表,让主进程通过非阻塞I/O方式来处理请求
上面的几种方式,各有千秋,
  第(1)中方法,由于创建新的进程的开销比较大,所以,会导致服务器性能比较差,但实现比较简单。
  第(2)种方式,由于要涉及到线程的同步,有可能会面临死锁等问题。
  第(3)种方式,在写应用程序代码时,逻辑比前面两种都复杂,而这种方式就是事件驱动方式
综合考虑各方面因素,一般普遍认为第(3)种方式是大多数网络服务器采用的方式

事件驱动模型是什么?

目前大部分的UI编程都是事件驱动模型,如很多UI平台都会提供onClick()事件,这个事件就代表鼠标按下事件。事件驱动模型大体思路如下:
  1. 有一个事件(消息)队列;
  2. 鼠标按下时,往这个队列中增加一个点击事件(消息);
  3. 有个循环,不断从队列取出事件,根据不同的事件,调用不同的函数,如onClick()、onKeyDown()等;
  4. 事件(消息)一般都各自保存各自的处理函数指针,这样,每个消息都有独立的处理函数;

#!/usr/bin/env python
# -*- coding:utf-8 -*-

from twisted.internet import reactor, protocol
from twisted.web.client import getPage
from twisted.internet import reactor
import time

class Echo(protocol.Protocol):

def dataReceived(self, data):
deferred1 = getPage('http://cnblogs.com')
deferred1.addCallback(self.printContents)

deferred2 = getPage('http://baidu.com')
deferred2.addCallback(self.printContents)

for i in range(2):
time.sleep(1)
print 'execute ',i

def execute(self,data):
self.transport.write(data)

def printContents(self,content):
print len(content),content[0:100],time.time()

def main():

factory = protocol.ServerFactory()
factory.protocol = Echo

reactor.listenTCP(8000,factory)
reactor.run()

if __name__ == '__main__':
main()


异步IO操作

参考:http://www.cnblogs.com/alex3714/articles/5248247.html http://www.cnblogs.com/wupeiqi/articles/5040823.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: