热门标签 | 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



推荐阅读
  • 本文探讨了在使用Apache Flink向Kafka发送数据过程中遇到的事务频繁失败问题,并提供了详细的解决方案,包括必要的配置调整和最佳实践。 ... [详细]
  • 本文介绍了一个基本的同步Socket程序,演示了如何实现客户端与服务器之间的简单消息传递。此外,文章还概述了Socket的基本工作流程,并计划在未来探讨同步与异步Socket的区别。 ... [详细]
  • Python网络编程:深入探讨TCP粘包问题及解决方案
    本文详细探讨了TCP协议下的粘包现象及其产生的原因,并提供了通过自定义报头解决粘包问题的具体实现方案。同时,对比了TCP与UDP协议在数据传输上的不同特性。 ... [详细]
  • 本文探讨了使用Python实现监控信息收集的方法,涵盖从基础的日志记录到复杂的系统运维解决方案,旨在帮助开发者和运维人员提升工作效率。 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • 本文档提供了详细的MySQL安装步骤,包括解压安装文件、选择安装类型、配置MySQL服务以及设置管理员密码等关键环节,帮助用户顺利完成MySQL的安装。 ... [详细]
  • 深入探讨Web服务器与动态语言的交互机制:CGI、FastCGI与PHP-FPM
    本文详细解析了Web服务器(如Apache、Nginx等)与动态语言(如PHP)之间通过CGI、FastCGI及PHP-FPM进行交互的具体过程,旨在帮助开发者更好地理解这些技术背后的原理。 ... [详细]
  • 本文详细解析了Java中流的概念,特别是OutputStream和InputStream的区别,并通过实际案例介绍了如何实现Java对象的序列化。文章不仅解释了流的基本概念,还探讨了序列化的重要性和具体实现步骤。 ... [详细]
  • 本文介绍了进程的基本概念及其在操作系统中的重要性,探讨了进程与程序的区别,以及如何通过多进程实现并发和并行。文章还详细讲解了Python中的multiprocessing模块,包括Process类的使用方法、进程间的同步与异步调用、阻塞与非阻塞操作,并通过实例演示了进程池的应用。 ... [详细]
  • MongoDB高可用架构:深入解析Replica Set机制
    MongoDB的高可用架构主要依赖于其Replica Set机制。Replica Set通过多个mongod节点的协同工作,实现了数据的冗余存储和故障自动切换,确保了系统的高可用性和数据的一致性。本文将深入解析Replica Set的工作原理及其在实际应用中的配置和优化方法,帮助读者更好地理解和实施MongoDB的高可用架构。 ... [详细]
  • 本文探讨了在当前开发环境中使用Django 1.5和Python 3.3的情况下,如何解决AWS和GAE仅支持Python 2.7的问题,并提供了相应的解决方案。 ... [详细]
  • 本文基于《Core Java Volume 2》的内容,深入探讨了网络编程中通过POST方法提交表单数据的技术细节,包括GET与POST方法的区别、POST提交的具体步骤及常见问题处理。 ... [详细]
  • C#中实现高效UDP数据传输技术
    C#中实现高效UDP数据传输技术 ... [详细]
  • 针对HTTP协议在数据传输过程中的安全漏洞,HTTPS应运而生,通过加密传输通道来防止信息泄露和篡改。作为一种基于SSL/TLS协议的加密超文本传输协议,HTTPS不仅提升了数据的安全性,还广泛应用于各种敏感信息的传输场景,如网上银行、电子商务和在线支付等。 ... [详细]
  • 如何尽量处理TIMEWAIT过多?
    如何尽量处理TIMEWAIT过多?编辑内核文件etcsysctl.conf,加入以下内容:net.ipv4.tcp_syncookies1表示开启SYNCookies。当出现SYN ... [详细]
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社区 版权所有