进修python标准库SocketServer

    添加时间:2013-5-6 点击量:

    导语:大牛们经常说浏览源码是很低效的进修办法。但对我辈初学者而言,浏览源码倒是把握编程思惟、编码规范的好路子。简而言之,读源码不是全能的,不读源码是切切不克不及的。


    SocketServer是标准库中一个很具有代表性的库。它基于socket供给一套快速建树socket办事器的框架,并可以经由过程Mix-in的技能让单线程办事器进化为多线程或多过程办事器。Socketserver.py里面的类很多,下面一个一个介绍并介绍它们之间关系。


    BaseServer、TCPServer、UDPServer,前者是后两者的父类。在父类中实现了TCP与UDP办事器可以共用的办法,并留下了须要在子类中实现的抽象类。是以在实际工作中,我们一般不该该持续BaseServer类,除非你是为了本身去实现或重载某些办法。别的,还有UnixStreamServer和UnixDatagramServer分别持续自TCPserver和UDPServer。这两个带Unix字样的类是用来构建nix下本地socket的办事器(本地socket接见速度更快,但只能用在本机的过程间通信)


    接下来是ForkingMixIn和ThreadingMixIn两个混淆类,它们都供给Server类中process_request办法的新实现,前者在处理惩罚每次用户连接的时辰都邑开启新的过程,而后者会开启新的线程。想要让Server类实现并发处理惩罚,只用哄骗多重持续即可。或者直接应用已经混淆好的



    class ForkingUDPServer(ForkingMixIn, UDPServer): pass
    
    class ForkingTCPServer(ForkingMixIn, TCPServer): pass

    class ThreadingUDPServer(ThreadingMixIn, UDPServer): pass
    class ThreadingTCPServer(ThreadingMixIn, TCPServer): pass


    最后没有介绍的是BaseRequestHandler、StreamRequestHandler、DatagramRequestHandler,同Server一样,前者是后两者的父类用来供给公用的办法


    凡是在应用SocketServer的时辰我们只用本身实例化一个合适的Server类,并在实例化时传递其的IP、端口,以及之前持续自某个RequestHandler的类(须要自行实现hanle办法,作为server的恳求处理惩罚器)


    这里须要希罕重视的:


    1.IP和端口是作为一个元组传递的而不是两个零丁的参数。


    2.每个客户连接都邑在hanle办法运行完之后被封闭,你若是不想封闭就须要重写Server中的def shutdown_request(self, request)办法


    ___________________我是华丽丽的分别线________________________


    可以说这个标准库用起来还很便利的,但功能上还是有一些不足。


    1.它没有供给各个hanle实例之间的通信机制,是以客户端互发消息还是须要本身实现一个调查者模型。


    不过这个功能似乎也跨越了SocketServer的工作职责了。我们可以本身实现,也可以应用python-message这个国产第三方库来进行线程间基于消息的编程。


    2.它供给了多线程多过程的解决规划,但没有异步规划的server每次接见都是梗阻的


    关于这点我感触感染很遗憾,不过这个库也不是太错杂,大不了本身写一个异步的socketserver吧,本身下手丰衣足食!



    因为底本就是是对源码的解读,所以这篇文章没有放什么代码。读者完全可以本身去标准库里翻翻看,注释写的真的很赞。

    我所有的自负皆来自我的自卑,所有的英雄气概都来自于我的软弱。嘴里振振有词是因为心里满是怀疑,深情是因为痛恨自己无情。这世界没有一件事情是虚空而生的,站在光里,背后就会有阴影,这深夜里一片寂静,是因为你还没有听见声音。—— 马良《坦白书》
    分享到: