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

ThreadingMixIn和ForkingMixIn类

异步混合:为了建立异步处理机制,需要使用ThreadingMixIn和ForkingMixIn类。以下是一个使用ThreadingMixIn类的示例

异步混合:

为了建立异步处理机制,需要使用ThreadingMixIn和ForkingMixIn类。

以下是一个使用ThreadingMixIn类的示例:

import socket
import threading
import socketserverclass ThreadedTCPRequestHandler(socketserver
.BaseRequestHandler):
def handle(self):
data = str(self.request.recv(1024), 'ascii')cur_thread = threading.current_thread()response = bytes("{}: {}".format(cur_thread.name, data), 'ascii')self.request.sendall(response)class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
passdef client(ip, port, message):sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)sock.connect((ip, port))try:sock.sendall(bytes(message, 'ascii'))response = str(sock.recv(1024), 'ascii')print("Received: {}".format(response))finally:sock.close()if __name__ == "__main__":# Port 0 means to select an arbitrary unused portHOST, PORT = "localhost", 0server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler)
ip, port = server.server_address
# Start a thread with the server -- that thread will then start one# more thread for each requestserver_thread = threading.Thread(target=server.serve_forever)# Exit the server thread when the main thread terminatesserver_thread.daemon = Trueserver_thread.start()
print("Server loop running in thread:", server_thread.name)client(ip, port, "Hello World 1")client(ip, port, "Hello World 2")client(ip, port, "Hello World 3")
server.shutdown()


结果应该类似这样:

 

Server loop running in thread: Thread-1
Received: Thread-2: Hello World 1
Received: Thread-3: Hello World 2
Received: Thread-4: Hello World 3

 

 

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.前言:

       虽说用Python编写简单的网络程序很方便,但复杂一点的网络程序还是用现成的框架比较好。这样就可以专心事务逻辑,而不是套接字的各种细节。SocketServer模块简化了编写网络服务程序的任务。同时SocketServer模块也是Python标准库中很多服务器框架的基础。

 

 

2.网络服务类:

SocketServer提供了4个基本的服务类:

TCPServer针对TCP套接字流

UDPServer针对UDP数据报套接字

UnixStreamServer和UnixDatagramServer针对UNIX域套接字,不常用。

它们的继承关系如下:

+------------+
| BaseServer |
+------------+|v
+-----------+ +------------------+
| TCPServer |------->| UnixStreamServer |
+-----------+ +------------------+|v
+-----------+ +--------------------+
| UDPServer |------->| UnixDatagramServer |
+-----------+ +--------------------+

2.1异步处理:

       这个四个服务类都是同步处理请求的。一个请求没处理完不能处理下一个请求。要想支持异步模型,可以利用多继承让server类继承ForkingMixIn 或 ThreadingMixIn mix-in classes

       ForkingMixIn利用多进程(分叉)实现异步。

       ThreadingMixIn利用多线程实现异步。

 

 

3.请求处理类:

        要实现一项服务,还必须派生一个handler class请求处理类,并重写父类的handle()方法。handle方法就是用来专门是处理请求的。该模块是通过服务类和请求处理类组合来处理请求的。

        SocketServer模块提供的请求处理类有BaseRequestHandler,以及它的派生类StreamRequestHandler和DatagramRequestHandler。从名字看出可以一个处理流式套接字,一个处理数据报套接字。

 

 

4.总结用SocketServer创建一个服务的步骤:

1.创建一个request handler class(请求处理类),继承自BaseRequestHandler class并重写它的handle()方法,该方法将处理到的请求。
2.实例化一个server class对象,并将服务的地址和之前创建的request handler class传递给它。
3.调用server class对象的handle_request() 或 serve_forever()方法来开始处理请求。


 

一个基于SocketServer的服务器示例:

 
  1. from SocketServer import TCPServer,StreamRequestHandler  
  2. #定义请求处理类  
  3. class Handler(StreamRequestHandler):  
  4.   
  5.     def handle(self):  
  6.         addr = self.request.getpeername()  
  7.         print 'Got connection from ',addr  
  8.         self.wfile.write('Thank you for connecting')  
  9.   
  10. server = TCPServer(('',1234), handler)  #实例化服务类对象  
  11.   
  12. server.server_forever() #开启服务  

from SocketServer import TCPServer,StreamRequestHandler
#定义请求处理类
class Handler(StreamRequestHandler):def handle(self):addr = self.request.getpeername()print 'Got connection from ',addrself.wfile.write('Thank you for connecting')server = TCPServer(('',1234), handler) #实例化服务类对象server.server_forever() #开启服务


 

 

5.实现异步,支持多连接

        前面介绍服务类时提到过,四个基本的服务类默认是同步模型的。要想支持异步可以利用多继承从ForkingMixInThreadingMixInmix-in classes和一个基本的服务类继承来定义一个支持异步的服务类。比如:

class Server(ThreadingMixIn, TCPServer): pass

        

         ForkingMixIn 要考虑进程间的通信。ThreadingMixIn要考虑线程访问同一变量时的同步和互斥。

 

 一个使用了多线程处理的服务器示例:

 
  1. from SocketServer import TCPServer, ThreadingMixIn, StreamRequestHandler  
  2.   
  3. #定义支持多线程的服务类,注意是多继承  
  4. class Server(ThreadingMixIn, TCPServer): pass  
  5.   
  6. #定义请求处理类  
  7. class Handler(StreamRequestHandler):  
  8.       
  9.     def handle(self):  
  10.         addr = self.request.getpeername()  
  11.         print 'Got connection from ',addr  
  12.         self.wfile.write('Thank you for connection')  
  13.   
  14. server = Server(('', 1234), Handler)    #实例化服务类  
  15. server.serve_forever()  #开启服务  

from SocketServer import TCPServer, ThreadingMixIn, StreamRequestHandler#定义支持多线程的服务类,注意是多继承
class Server(ThreadingMixIn, TCPServer): pass#定义请求处理类
class Handler(StreamRequestHandler):def handle(self):addr = self.request.getpeername()print 'Got connection from ',addrself.wfile.write('Thank you for connection')server = Server(('', 1234), Handler) #实例化服务类
server.serve_forever() #开启服务


 

 


推荐阅读
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • 1、Ipv4只能用于内网,外网只能用2、DNS:把域名解析成ip地址3、MAC地址就是物理地址(网卡序列号)   IP地址:电脑序列号4、不同电脑,微信之间互相通信,靠的是端口;  ... [详细]
  • python3+tkinter实践历程(四)——模仿CRT完成基于socket通信与tkinter的TCP串口客户端
    python3tkinter实践历程(四)——基于socket通信与tkinter的TCP串口客户端(仿CRT)文章目录系列文章目录分享背景制作背景最终功能工具截图展示代码详解系列 ... [详细]
  • python网络编程 day27 网络编程初识 ——socket
    一、内容回顾1、两个内置函数(装饰器)及类中的魔术方法 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • UML 包图
    什么是包包可直接理解为命名空间,文件夹,是用来组织图形的封装,包图可以用来表述功能组命名空间的组织层次。•在面向对象软件开发的视角中&#x ... [详细]
  • iwanttowriteasimpleAppforme(Android).Forthisitisnecessarythattheservercansenddat ... [详细]
  • 今天搭建了redis环境,使用自带的benchmark进行了性能测试选择测试键的范围大小默认情况下面,基准测试使用单一的key。在一个基于内存的数据库里,单一key测试和真实情况下 ... [详细]
  • python图书管理系统类_Python标准库socketserver使用线程混入实现异步TCP服务器
    推荐图书:《Python程序设计开发宝典》,ISBN:978-7-302-47210-0,董付国,清华大学出版 ... [详细]
  • 并不是上一个用SocketServer的聊天室的延续。用远程调用完成的聊天室。正好有Java的RMI聊天室的作业,就先用Python写了一个简单的类似远程调用的东西& ... [详细]
author-avatar
MICH泪的矿脉AEI
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有