zoukankan      html  css  js  c++  java
  • 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是一个非常优秀的高性能网络编程框架. 

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

       

  • 相关阅读:
    python中的字符数字之间的转换函数
    java中的this和super的作用和异同和C++中调用父类的构造函数
    夺命雷公狗---Smarty NO:19 html_options函数
    夺命雷公狗---Smarty NO:18 html_checkboxes
    夺命雷公狗---Smarty NO:17 html_table函数
    夺命雷公狗---Smarty NO:16 html_image函数
    夺命雷公狗---Smarty NO:15 fetch函数
    夺命雷公狗---Smarty NO:14 debug调试
    夺命雷公狗---Smarty NO:13 系统自定义函数(plugins)
    夺命雷公狗---Smarty NO:12 section函数
  • 原文地址:https://www.cnblogs.com/mumuxinfei/p/4527312.html
Copyright © 2011-2022 走看看