WEB开发网
开发学院软件开发Python 使用 Twisted Matrix 框架来进行网络编程,第 1 部... 阅读

使用 Twisted Matrix 框架来进行网络编程,第 1 部分

 2008-11-13 13:15:03 来源:WEB开发网   
核心提示: 增强的服务器让我们设法增强 Twisted Weblog 服务器,以便它遵循 SocketServer-weblog.py 的模式;无须客户机重复请求即可向客户机提供新记录,使用 Twisted Matrix 框架来进行网络编程,第 1 部分(4),这里的问题是,向 WebLog(Prot

增强的服务器

让我们设法增强 Twisted Weblog 服务器,以便它遵循 SocketServer-weblog.py 的模式;无须客户机重复请求即可向客户机提供新记录。这里的问题是,向 WebLog(Protocol) 方法中插入 time.sleep() 调用会导致它阻塞,因此是不允许的。在我们这样做的时候,请注意以前的服务器可能会犯错误,因为它们只向一个客户机提供每批新记录。我们猜测,如果您想允许多个客户机监控一个 Weblog,那么您也会希望它们都接收正在进行的更新。

Twisted Matrix 在不阻塞的情况下延迟操作的方法是使用 .callLater() 方法向反应器添加回调。以此方法添加的回调被添加到提供服务的事件队列中,但只有在指定的延迟之后才会真正地对其进行处理。将这两项更改放在一起,增强的 Weblog 服务器看起来类似:

清单 4. twisted-weblog-1.py

  from twisted.internet import reactor
from twisted.internet.protocol import Protocol, Factory
from webloglib import hit_tag, log_fields
import time
class WebLog(Protocol):
  def connectionMade(self):
    print"Connected from", self.transport.client
    self.transport.write('<hits>')
    self.ts = time.time()
    self.newHits()
  def newHits(self):
    for hit in self.factory.records:
      if self.ts <= hit[0]:
        self.transport.write(hit_tag % log_fields(hit[1]))
    self.ts = time.time()
    reactor.callLater(5, self.newHits)
  def connectionLost(self, reason):
    print"Disconnected from", self.transport.client
class WebLogFactory(Factory):
  protocol = WebLog
  def __init__(self, fname):
    self.fname = fname
    self.records = []
  def startFactory(self):
    self.fp = open(self.fname)
    self.fp.seek(0, 2) # Start at end of current access log
    self.updateRecords()
  def updateRecords(self):
    ts = time.time()
    for rec in self.fp.readlines():
      self.records.append((ts, rec))
    self.records = self.records[-100:] # Only keep last 100 hits
    reactor.callLater(1, self.updateRecords)
  def stopFactory(self):
    self.fp.close()
if __name__=='__main__':
  reactor.listenTCP(8888, WebLogFactory('access-log'))
  reactor.run()

上一页  1 2 3 4 5 6  下一页

Tags:使用 Twisted Matrix

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接