• twisted 初体验


    前言:
      最近帮朋友review其模块服务代码, 使用的是python的twisted网络框架. 鉴于之前并没有使用过, 于是决定好好研究一番.
      个人接触最早的高性能网络编程框架是Mina, 所谓先入为主, 对异步网络编程的理解上, 往往冒出Mina的影子来.
      本文借助简单的twisted demo例子, 对twisted有个初步的印象, 并作为学习笔记.

    环境配置:
      官网地址如下: twisted官网. 其不仅包含了twisted 源码和安装版本下载, 也包含了详尽的Echo样例.
      以linux环境为例: python版本为2.7, 下载twisted的最新源码, 同时下载其依赖的zope.interface库.
      环境配置可采用如下方式:
      1). setup安装

    python setup.py install

      2). 配置PYTHONPATH
      找到源码对应的位置, 配置环境变量PYTHONPATH, 这种情况可以绕过用户权限问题.

    export PYTHONPATH=/path/to/twisted:/path/to/zope.interface:${PYTHONPATH}

    例程:
      twisted的Demo例程很多, 我们以最简单的Demo服务为例.

    #! /usr/bin/python
    #-*- coding: UTF-8 -*-
    
    from twisted.internet import reactor
    from twisted.internet import protocol
    
    class Echo(protocol.Protocol):
        def dataReceived(self, data):
            self.transport.write(data)
    
    class EchoFactory(protocol.Factory):
        def buildProtocol(self, addr):
            return Echo()
    
    
    reactor.listenTCP(9090, EchoFactory())
    reactor.run()

      整个echo服务, 只有短短的那么几行, 是不是很厉害, ^_^.
      twisted借助reactor, 来驱动网络IO的事件循环. 其层次可以看到Transport层和Protocol层.
      一个简单的网络服务, 开发者只需重新定义Protocol协议层即可.

    测试:
      借助netcat工具来测试该echo服务.
      
      也可以借助telnet工具来测试, 两者皆可行.
      

    简单分析:
      默认情况下, 其并没有利用到多核, 通过top -Hp命令才查看其线程数.
      
      即使是在压测过程中, 其twisted始终只有一个线程. 这和Mina的Acceptor线程和IO线程开分的方式还是有所区别, 不知道twisted怎么配置?
      还有一个问题是, twisted到底使用的epoll reactorselect reactor, 这个问题在网上曾有激烈的讨论, 可参见如下博文: "用python来开发webgame服务端(2)".
      这边我们采用strace命令来查看一下:

    strace python echo_server.py 2>&1 | grep epoll --color

      
      通过strace命令工具, 可以在系统调用中看到, 该版本的twisted在当前的linux环境中, 采用epoll的模式.

    总结:
      twisted框架的入门门槛还是比较低的, 但若要深入和性能挖掘, 需要花费不少的时间. 著名的爬虫框架scrapy底层也是采用twisted来实现, 由此可见, twisted是一个非常优秀的高性能网络编程框架. 

    写在最后:
      
    如果你觉得这篇文章对你有帮助, 请小小打赏下. 其实我想试试, 看看写博客能否给自己带来一点小小的收益. 无论多少, 都是对楼主一种由衷的肯定.

       

  • 相关阅读:
    ubuntu如何设置dns?
    docker服务无法启动如何处理?
    yocto编译时报错"fontconfig-2.12.1/src/fcmatch.c:324:63: error: ‘PRI_CHAR_WIDTH_STRONG' undeclared here (not in a function); did you mean ‘PRI_WIDTH_STRONG’?"
    git如何将当前仓库的远程分支推到一个新的仓库中?
    linux下如何制作ubuntu系统启动盘(sd)?
    yocto编译时报错"glibc/locale/xlocale.h:39:4: note: previous declaration of '__locale_t' was here"
    19、异常处理
    18、文件与目录
    17、python对内存的使用
    16、正则表达式
  • 原文地址:https://www.cnblogs.com/mumuxinfei/p/4527312.html
Copyright © 2020-2023  润新知