【问题标题】:Creating a multithreaded server using SocketServer framework in python在 python 中使用 SocketServer 框架创建多线程服务器
【发布时间】:2013-12-23 14:15:30
【问题描述】:
#!/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()

【问题讨论】:

    标签: python multithreading sockets


    【解决方案1】:

    它比你想象的要简单得多:

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

    您只需使用新的ThreadedTCPServer 而不是TCPServer

    更多信息可以阅读some doc

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

    1. target 参数必须是 callable 对象,而不是“已调用”对象。
    2. 要处理许多请求,您需要构建一个线程池。如果您只使用一个线程,它是主线程还是“子”线程没有任何区别。

    【讨论】:

    • 好的,谢谢。对于像我这样的新手来说,文档中的示例很复杂。所以,我采用了你的想法,现在我的程序按预期工作了。
    【解决方案2】:
    #!/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()
    

    【讨论】:

    • 这一行 thread.start_new_thread(server.serve_forever(),()) 应该只是 server.serve_forever()
    【解决方案3】:

    你不应该循环

    server = SocketServer.TCPServer(('',1520), service)
    t = Thread(target=server.serve_forever())
    t.start()
    

    只是猜测..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-18
      • 1970-01-01
      • 1970-01-01
      • 2018-11-26
      相关资源
      最近更新 更多