`
fanzy618
  • 浏览: 20303 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

线程池版的SocketServer

阅读更多
python的SocketServer模块提供了一个开发socket server的捷径。但是其自带的异步handler ThreadingMixIn每次处理请求是都会产生一个新的线程,在负载较重的时候会有一些问题。需要一个使用线程池的TCPServer.

具体的代码如下:
from threading import Thread
from SocketServer import ThreadingMixIn, TCPServer, BaseRequestHandler
from Queue import Queue, Empty

class PooledThreadTCPServer(TCPServer, object):
    def __init__(self, server_address, RequestHandlerClass, thread_num):
        super(PooledThreadTCPServer, self).__init__(server_address, RequestHandlerClass)
        self.__thread_num = thread_num
        self.__queue = Queue()
       
    def __thread_main(self):
        while self.__serving:
            try:
                request, client_address = self.__queue.get(True, 0.5)
            except Empty:
                continue
            self.process_request_thread(request, client_address)
        db.close()
    
    def process_request_thread(self, request, client_address):
        try:
            self.finish_request(request, client_address)
        except:
            self.handle_error(request, client_address)
        finally:
            self.close_request(request)
    
    def process_request(self, request, client_address):
        self.__queue.put((request, client_address))
        
    def serve_forever(self):
        self.__serving = True
        for i in range(self.__thread_num):
            t = Thread(target=self.__thread_main)
            t.setDaemon(True)
            t.start()
        super(PooledThreadTCPServer, self).serve_forever()



继承自TCPServer和object。
继承object的原因是需要使用super调用父类的方法,不继承object就可能报错。
process_request方法在有请求到来的时候被调用。
它将request和客户端地址放到一个队列里。

配合一个RequestHandler,就可以轻松的实现一个线程池版的TCPServer
class EchoRequestHandler(BaseRequestHandler):
    def handle(self):
        data = self.request.recv(1024)
        if data == "quit":
            self.server.shutdown()
        self.request.send(data)

if __name__ == "__main__":
    addr = ("localhost", 12345)
    server = PooledThreadTCPServer(addr, EchoRequestHandler, 10)
    server.serve_forever()


需要注意的是,如果RequestHandler中执行的是CPU密集型的操作,那么线程池
无助于提高性能。python同一时间只能有一个线程在运行,无论你有多少CPU。

0
1
分享到:
评论

相关推荐

    java socket线程池

    Java中,线程池是通过java.util.concurrent.ThreadPoolExecutor类实现的,它为Java应用程序提供了一种有效地管理线程资源的方式。从JDK 1.5开始,Java并发API得到了增强,提供了更为强大的并发工具和库,其中就包括...

    多线程SocketServer

    本项目名为“多线程SocketServer”,专注于C++语言实现的Windows线程池技术,旨在构建一个高效、可扩展的多线程服务器。让我们深入探讨一下这个项目涉及到的关键知识点。 首先,**Socket**是网络通信的基础,它是...

    C# SocketServer

    - 对于多客户端同时连接的情况,可以考虑使用线程池或者异步IO来提高性能。 通过以上知识点的学习,我们可以掌握如何在C#中构建一个基本的SocketServer,并能够进一步扩展功能以满足不同的需求。

    socket 线程池实现(已经在项目中应用)

    在`SocketServer`类中,你需要创建一个`ExecutorService`实例,这是Java内置的线程池接口。你可以使用`Executors`工具类的静态方法来创建线程池,例如`newFixedThreadPool(int nThreads)`,它会创建一个固定大小的...

    Python SocketServer通信框架项目实例

    配置文件,可能包含了服务器的端口号、最大连接数、线程池大小等设置,以及任何其他与项目相关的配置参数。 8. **server.py**: 服务器端的实现,可能包含了启动SocketServer、注册处理请求的RequestHandler,...

    Select方式实现的socketServer程序示例

    7. **线程池或异步处理**:为了提高服务器的并发处理能力,可以使用线程池或者异步I/O模型,使得服务器在处理一个客户端请求的同时,能够接受其他客户端的连接。 8. **性能优化**:`select`的一个限制是它可以监控...

    SocketServer-Desktop.rar

    在本文中,我们将深入探讨标题为"SocketServer-Desktop.rar"的压缩包所包含的Socket通信知识,以及如何构建一个简单的桌面聊天程序服务端。 首先,Socket是网络通信中的一个抽象概念,它代表了两台计算机之间的一个...

    SocketServer

    SocketServer 是一个基于 ...- 配置文件:可能包含服务器配置信息,如端口设置、线程池大小等。 通过阅读源代码和文档,你可以更深入地理解 SocketServer 的工作原理和使用方法,从而在自己的项目中有效地利用这个库。

    java socket多线程处理框架SocketServer

    客户端的请求首先会进入请求队列,处理器线程池会向请求队列获取请求并且分配分配处理器,每个处理器分配一个线程。处理器可以指定interceptor,处理逻辑都实现在ResponseHandler中。空闲时,处理器线程会休眠直到有...

    java聊天系统代码讲解

    - **多线程处理**:服务器需要同时处理多个客户端的连接,因此需用到线程池或SocketServer类来实现并发处理。 - **会话管理**:为每个客户端创建独立的会话,保存用户状态和聊天记录。 - **消息广播**:接收到...

    SocketServer:使用Java构建的套接字服务器

    7. **性能优化**:对于高并发场景,可以考虑使用线程池来管理线程,以避免过度创建线程导致系统资源浪费。Java的`ExecutorService`和`ThreadPoolExecutor`类可以帮助实现这一目标。 8. **安全性**:使用...

    public-server.zip

    本项目通过`public-server.zip`文件,展示了一个用Java实现的SocketServer,实现了点对点(Peer-to-Peer, P2P)文件传输功能,特别利用了两种不同的线程池来优化多线程上传和下载性能。以下是这个项目的核心知识点和...

    python入门教程-02-静态web服务器-多任务版.ev4.rar

    在这个"python入门教程-02-静态web服务器-多任务版"中,我们将深入学习如何使用Python构建一个简单的静态Web服务器,并了解如何实现多任务处理,以提高服务器的性能。 首先,让我们了解静态Web服务器的基本概念。...

    Android使用socket的demo

    可以使用AsyncTask或线程池处理。 - **异常处理**:网络操作可能出现各种异常,如`IOException`,需要进行适当的异常捕获和处理。 - **资源释放**:通信结束后,记得关闭Socket、InputStream和OutputStream,防止...

    Android使用webView和ServerSocket模拟客户端和服务端通讯

    - 由于`ServerSocket`在同一个端口上只能服务于一个客户端,所以如果有多个客户端同时请求,可能需要多线程处理或使用线程池。 - 为了安全起见,不要在生产环境中使用`172.0.0.1`,而是应该使用设备的局域网IP,以...

    winsock多线程实例

    从提供的压缩包文件名来看,`SocketServer.zip`可能包含了一个服务器端的示例,`SocketHandle.zip`可能涉及套接字的处理,而`SocketPort_Linux.zip`可能是针对Linux环境的版本,尽管题目要求的是Windows平台的实现。...

    Socket TCPSERVER

    例如,可以使用线程池来管理每个客户端连接的线程,以提高资源利用率。同时,为了保证服务的稳定性和健壮性,需要捕获并适当处理可能出现的异常,如SocketException等。 总的来说,C#中的Socket TCPSERVER通过异步...

    iocp网络核心源码c++

    1. **SocketServer.cpp**:包含了服务器的主逻辑,可能涉及监听套接字、接收客户端连接、处理客户端请求等功能。 2. **Utils.cpp**:通常包含一些通用的工具函数,如时间处理、字符串操作、网络辅助函数等。 3. **IO...

    WPF-Socket服务端对多个客户端_新

    2. **使用线程池**:使用`ThreadPool`或`Task`来处理客户端连接,以更有效地利用系统资源。 3. **负载均衡**:如果服务器承载能力有限,可以考虑使用负载均衡技术,将连接分发到多个服务器。 4. **提高缓冲区大小**...

    Socket通讯(主从code)

    在实际应用中,为了处理并发连接,服务器通常会创建一个线程池来处理每个客户端的连接,避免因单线程阻塞导致其他客户端无法接入。客户端则可能需要处理异常,如连接失败或通信中断等。 总结来说,Socket通讯在C#中...

Global site tag (gtag.js) - Google Analytics