web-dev-qa-db-ja.com

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()
13
ρss

それはあなたが思っているよりはるかに簡単です:

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

ThreadedTCPServerの代わりに新しいTCPServerを使用する必要があるだけではありません。

詳細については、 いくつかのドキュメント を読むことができます。

ただし、コードでいくつかの間違いを犯しました。

  1. target引数は、「すでに呼び出された」オブジェクトではなく、callableオブジェクトである必要があります。
  2. 多くのリクエストを処理するには、スレッドプールを構築する必要があります。 1つのスレッドのみを使用する場合、それがメインスレッドであるか「子」スレッドであるかは関係ありません。
8
smeso
#!/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()
1
ρss