热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python网络编程(2)复用socketI/O实现更好的性能

第二章主要在上一章的基础上介绍了以下内容:1.ForkingMixIn2.ThreadingMixIn3.select.select4.select.epoll5.D

  第二章主要在上一章的基础上介绍了以下内容:

    1. ForkingMixIn

    2. ThreadingMixIn

    3. select.select

    4. select.epoll

    5. Diesel库

ForkingMixIn 和 ThreadingMixIn属于socketserver(python2是SocketServer)模块,该模块能够简化编写web服务器的工作。其包含四种基本的服务器class:

  TCPServer 使用TCP协议,在服务器和客户端之间建立持续的连续,安全;

  UDPServer 使用UDP协议,采用数据包的方法在服务器和客户端之间传递数据,有丢失包的可能,但是传输速度很快;

  UnixStreamServer和UnixDatagramServer 比较少使用, 分别与TCPServer、UDPServer相似,但是基于Unix上定义的套接字,在其他平台上不能使用。

图1. Servers的继承关系

以上四种类都是同步的,即下一个请求开始前,上一个请求必须完成。显然,他们并不适用于当请求需要较长处理时间的情况。为每个请求创建单独的进程或线程的方式可以解决这个问题,即实现服务器和客户端的异步通信,为此socketserver模块添加了ForkingMixIn和ThreadingMixIn两个类。

  为了创建一个服务,首先通过继承BaseRequestHandler类并重写其handler()方法得到一个句柄类,它将用来处理到达服务器的请求;

class ForkingServerRequestHandler(SocketServer.BaseRequestHandler):

然后以服务器地址和上一步得到的句柄实例化前面继承自ForkingMixIn/ThreadingMixIn和TCPServer/UDPServer/UnixStreamServer/UnixDatagramServer的server,

class ForkingServer(SocketServer.ForkingMixIn, SocketServer.TCPServer,):passserver = ForkingServer((SERVER_HOST, SERVER_PORT), ForkingServerRequestHandler)

注意:ForkingMixIn必须写在TCPServer前面,因为它重载了TCPServer类的方法。

最后,调用handler_request()或者server_forever()方法来开始处理请求。

server_thread = threading.Thread(target=server.serve_forever)

  值得注意的是,如果server类继承自ThreadingMixIn,则需要明确指定遇到异常停止时的处理方法,ThreadingMixIn类定义了daemon_threads方法,其指定了服务器是否需要等待直到所有线程终止,默认为False。

server_thread.setDaemon(True)

下面是一个简单的例子:

import osimport socketimport threadingimport SocketServerSERVER_HOST = 'localhost'SERVER_PORT = 0 # tells the kernel to pick up a port dynamicallyBUF_SIZE = 1024ECHO_MSG = 'Hello echo server!'class ForkedClient():""" A client to test forking server"""def __init__(self, ip, port):# Create a socketself.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# Connect to the serverself.sock.connect((ip, port))def run(self):""" Client playing with the server"""# Send the data to servercurrent_process_id = os.getpid()print 'PID %s Sending echo message to the server : "%s"' %(current_process_id, ECHO_MSG)sent_data_length = self.sock.send(ECHO_MSG)print "Sent: %d characters, so far..." %sent_data_length# Display server responseresponse = self.sock.recv(BUF_SIZE)print "PID %s received: %s" % (current_process_id,response[5:])def shutdown(self):""" Cleanup the client socket """self.sock.close()class ForkingServerRequestHandler(SocketServer.BaseRequestHandler):def handle(self):# Send the echo back to the clientdata = self.request.recv(BUF_SIZE)current_process_id = os.getpid()response = '%s: %s' % (current_process_id, data)print "Server sending response [current_process_id: data] =[%s]" %responseself.request.send(response)
returnclass ForkingServer(SocketServer.ForkingMixIn,SocketServer.TCPServer,):"""Nothing to add here, inherited everything necessary fromparents"""passdef main():# Launch the serverserver = ForkingServer((SERVER_HOST, SERVER_PORT),ForkingServerRequestHandler)ip, port = server.server_address # Retrieve the port numberserver_thread = threading.Thread(target=server.serve_forever)server_thread.setDaemon(True) # don't hang on exitserver_thread.start()print 'Server loop running PID: %s' %os.getpid()# Launch the client(s)client1 = ForkedClient(ip, port)client1.run()client2 = ForkedClient(ip, port)client2.run()# Clean them upserver.shutdown()client1.shutdown()client2.shutdown()server.socket.close()if __name__ == '__main__':main()

  

转:https://www.cnblogs.com/weixinbupt/p/4709566.html



推荐阅读
  • SpringBoot使用Netty实现远程调用的示例
    这篇文章主要介绍了SpringBoot使用Netty实现远程调用的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 如何在php文件中添加图片?
    本文详细解答了如何在php文件中添加图片的问题,包括插入图片的代码、使用PHPword在载入模板中插入图片的方法,以及使用gd库生成不同类型的图像文件的示例。同时还介绍了如何生成一个正方形文件的步骤。希望对大家有所帮助。 ... [详细]
  • 【重识云原生】第四章云网络4.8.3.2节——Open vSwitch工作原理详解
    2OpenvSwitch架构2.1OVS整体架构ovs-vswitchd:守护程序,实现交换功能,和Linux内核兼容模块一起,实现基于流的交换flow-basedswitchin ... [详细]
  • POCOCLibraies属于功能广泛、轻量级别的开源框架库,它拥有媲美Boost库的功能以及较小的体积广泛应用在物联网平台、工业自动化等领域。POCOCLibrai ... [详细]
  • 网络编程:其实就是在学socketsocket是什么?翻译过来称为套接字是对底层的TCPIPUDP等网络协议进行封装使得上层的应用程序开发者,不用直接接触这对复杂,丑陋的协议在程序 ... [详细]
  • 今天搭建了redis环境,使用自带的benchmark进行了性能测试选择测试键的范围大小默认情况下面,基准测试使用单一的key。在一个基于内存的数据库里,单一key测试和真实情况下 ... [详细]
  • python图书管理系统类_Python标准库socketserver使用线程混入实现异步TCP服务器
    推荐图书:《Python程序设计开发宝典》,ISBN:978-7-302-47210-0,董付国,清华大学出版 ... [详细]
  • NFS文件共享系统
    1、概述:NFS(NetworkFileSystem)意为网络文件系统,它最大的功能就是可以通过网络,让不同的机器不同的操作系统可以共享 ... [详细]
  • c# java socketn 字节流_C#Socket编程详解(一)TCP与UDP简介
    一、TCP与UDP(转载)1、TCP1.1定义TCP(TransmissionControlProtocol)传输控制协议。是一种可靠的、面向连接的协议(eg:打电话)、传输效率低 ... [详细]
  • UML 包图
    什么是包包可直接理解为命名空间,文件夹,是用来组织图形的封装,包图可以用来表述功能组命名空间的组织层次。•在面向对象软件开发的视角中&#x ... [详细]
  • Socketsend函数和recv函数详解send函数intsend(SOCKETs,constcharFAR*buf,intlen,intflags);不论是客户还是服务器应用程 ... [详细]
  • java local socket_网络通信之Socket与LocalSocket的比较
    Socket与LocalSocket都可以实现网络通信,两个有什么区别呢?LocalSocket其通信方式与Socket差不多,只是Loc ... [详细]
author-avatar
mobiledu2502861417
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有