在python中使用SocketServer框架创建多线程服务器 [英] Creating a multithreaded server using SocketServer framework in python

查看:766
本文介绍了在python中使用SocketServer框架创建多线程服务器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

#!/usr/bin/env python
#-*- coding: utf-8 -*-

import sys
sys.dont_write_bytecode = True
import shlex
import subprocess
import SocketServer

sess = []

class TCPHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        global sess
        sess.append(self.request)
        ip,port = self.client_address
        print "#%d: client %s:%d"%(len(sess),ip,port)
        while True:
            cmd = self.request.recv(8192)
            out = subprocess.check_output(shlex.split(cmd),stderr=subprocess.STDOUT,shell=True)
            self.request.send(out)
        self.request.close()
class ThreadedTCPServer(SocketServer.ThreadingMixIn,SocketServer.TCPServer): pass

if __name__ == "__main__":
    port = 4242
    svr = ThreadedTCPServer(("",port),TCPHandler)
    print ":%d"%port
    svr.serve_forever()

推荐答案

它比您想象的简单得多:

It is much more simple than you think:

class ThreadedTCPServer(SocketServer.ThreadingMixIn,SocketServer.TCPServer): pass

比起您只需要使用新的ThreadedTCPServer而不是TCPServer.

Than you just have to use your new ThreadedTCPServer instead of TCPServer.

有关更多信息,您可以阅读一些文档.

For more information you can read some doc.

但是在您的代码中您犯了一些错误:

However in your code you made some mistakes:

  1. target参数必须是callable对象,而不是已经调用"的对象.
  2. 要处理许多请求,您需要构建一个线程池.如果仅使用一个线程,则它是主线程还是子"线程没有什么区别.
  1. The target argument must be a callable object not an "already-called" object.
  2. To handle many requests you need to build a Threads pool. If you only use one thread it does not make any difference if it is the main thread or a "child" thread.

这篇关于在python中使用SocketServer框架创建多线程服务器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆