文档章节

zg手册 之 twisted 开发(1)-- twisted 框架介绍

 东昕
发布于 2014/06/21 23:19
字数 841
阅读 395
收藏 6

异步非阻塞框架

twisted 是一个事件驱动的网络开发框架,使用 python 开发。

twisted 框架编写的服务器有几个基本的元素:

  1. 应用程序对象(application):管理应用程序资源的对象,一个应用程序可以管理多个service对象。

  2. 服务(service),服务对象启动监听的端口,

  3. 协议工厂(factory):当客户端连接到服务器时,用来创建协议对象。

  4. 协议(protocol):每个协议对象对应一个网络连接。协议类处理网络协议(如http,ftp,自定义协议等)


twisted 框架内部运行依赖的元素:

  1. reactor:异步事件的主要循环处理类,负责监控事件,调用注册的回调函数提供服务。(在linux上主要使用epoll/select来实现)

  2. defer: 异步回调序列,当序列被执行的时候,顺序执行注册的回调函数。


官方的一个例子

实现一个 echo server,创建文件 echoServ.py

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

from twisted.internet.protocol import Protocol
from twisted.internet.protocol import Factory
from twisted.internet.endpoints import TCP4ServerEndpoint
from twisted.internet import reactor

class Echo(Protocol):
        '''协议类实现用户的服务协议,例如 http,ftp,ssh 等'''
        def __init__(self, factory):
                self.factory = factory

        def connectionMade(self):
                '''连接建立时被回调的方法'''
                self.factory.numProtocols = self.factory.numProtocols + 1
                self.transport.write("Welcome! There are currently %d open connections.\n" %
                                (self.factory.numProtocols,))

        def connectionLost(self, reason):
                '''连接关闭时被回调的方法'''
                self.factory.numProtocols = self.factory.numProtocols - 1

        def dataReceived(self, data):
                '''接收数据的函数,当有数据到达时被回调'''
                self.transport.write(data)


class EchoFactory(Factory):
        '''协议工厂类,当客户端建立连接的时候,创建协议对象,协议对象与客户端连接一一对应'''
        numProtocols = 0
        def buildProtocol(self, addr):
                return Echo(self)


if __name__ == '__main__':
        # 创建监听端口
        reactor.listenTCP(8007, EchoFactory())

        # 开始监听事件
        reactor.run()

运行服务程序

python echoServ.py

测试服务程序

telnet 127.0.0.1 8007


例子程序的说明

  1. 协议类继承自 twisted.internet.protocol.Protocol,需实现 dataReceived 等方法。在协议类中实现应用协议。

  2. 协议工厂继承自 twisted.internet.protocol.Factory,需实现 buildProtocol 方法。协议工厂负责实例化协议类,不应该保存于连接相关的状态信息。

  3. transport 就是连接对象,通过它进行网络写数据。


使用 daemon 的方式运行程序

使用守护进程的方式运行服务,需要提供一个 tac 配置文件(这就是一个 python 文件,只是扩展名不同),并且在这个文件中需要创建一个应用程序对象,对象名必须是 application。

创建一个 echo.tac 文件

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

from twisted.application import service, internet
from echoServ import EchoFactory

# 创建应用程序对象
application = service.Application('Echo 服务程序')

# 创建 service 对象
myServices = internet.TCPServer(8007, EchoFactory())

# 设置 application 为 service 的父元素
myservices.setServiceParent(application)

用守护进程方式运行服务

twistd -y echo.tac

停止服务

kill -15 pid


总结

上面就是 twisted 网络框架编写服务的基本方法,在框架内部有丰富的协议工厂,协议,可是很方便的实现简单的 http,ftp,ssh 等服务器程序。

后面我会介绍一些常用的功能的实现原理,例如:如何记录日志,客户端 http 异步请求的处理,defer 运行原理等。


原文链接: http://www.hopez.org/blog/9/1403349568

© 著作权归作者所有

共有 人打赏支持
粉丝 11
博文 22
码字总数 16965
作品 0
浦东
架构师
zg手册 之 scrapy 开发(5)-- downloader(下载器)开发

为什么需要开发下载器 定向抓取时,目标站点的数据不能单次请求获取,需要3,4次或者更多,请求之间有依赖关系,就是需要连续请求完成这个下载事物 前面讲过的 js 动态页面下载 ...... 注意事...

东昕
2014/04/02
0
1
zg手册 之 twisted 开发(2)-- Deferreds 组件

Deferreds 异步回调序列 Deferred 本质上是一个回调函数的集合,twisted 提供了对函数延迟调用的机制。 在 twisted 内部,使用 Deferred 对象管理回调序列。当异步请求结果返回时,使用 Defe...

东昕
2014/06/24
0
0
【转】Python Twisted介绍

Python Twisted介绍 作者:Jessica McKellar 原文链接   Twisted是用Python实现的基于事件驱动的网络引擎框架。Twisted诞生于2000年初,在当时的网络游戏开发者看来,无论他们使用哪种语言...

罗兵
2016/06/27
0
0
[Python] Twiested - 基于事件驱动的网络编程

介绍 twisted 是python下一个事件驱动的网络引擎库, 支持很多种的协议. 它包含了一个web服务, 多种IM客户端,服务端, 邮件服务协议. 由于规模庞大, twisted分成了几个sub-project. 一起或者分...

长平狐
2013/06/03
117
0
[Python] Twiested - 基于事件驱动的网络编程

介绍 twisted 是python下一个事件驱动的网络引擎库, 支持很多种的协议. 它包含了一个web服务, 多种IM客户端,服务端, 邮件服务协议. 由于规模庞大, twisted分成了几个sub-project. 一起或者分...

长平狐
2013/06/03
279
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

day60-20180818-流利阅读笔记-待学习

钉钉:工作的归工作,生活的…也归工作? 毛西 2018-08-18 1.今日导读 你用过“钉钉”么?被公司要求使用钉钉的感受是如何的呢?这款阿里巴巴旗下的移动办公社交平台在弯道超车微信、为许多企...

aibinxiao
43分钟前
6
0
Kubernetes的HTTPS和证书问题,汇总

通过Kubernetes建立服务网站,需要干的事情和HTTPS和证书问题,汇总如下: 建立Nginx服务器 搞服务器第一步,Ubuntu 18.04设置静态IP 安装Nginx服务。 Kubernetes的deployment使用 创建服务,...

openthings
58分钟前
2
0
php 使用redis锁限制并发访问类

1.并发访问限制问题 对于一些需要限制同一个用户并发访问的场景,如果用户并发请求多次,而服务器处理没有加锁限制,用户则可以多次请求成功。 例如换领优惠券,如果用户同一时间并发提交换领...

豆花饭烧土豆
今天
0
0
Linux环境搭建 | 手把手教你配置Linux虚拟机

在上一节 「手把你教你安装Linux虚拟机」 里,我们已经安装好了Linux虚拟机,在这一节里,我们将配置安装好的Linux虚拟机,使其达到可以开发的程度。 Ubuntu刚安装完毕之后,还无法进行开发,...

良许Linux
今天
0
0
(三)Nginx配置·续

概述 前文写了关于Nginx环境配置,但是还没有完,接下来将会继续讲三个相关的配置 主要是以下三个 1.Nginx访问日志 2.Nginx日志切割 3.静态文件不记录日志和过期时间 Nginx访问日志 1.先看看...

杉下
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部