2

Pythonでサーバーを完全に終了するにはどうすればよいですか?のようなコードserver.shutdown()は、着信要求をシャットダウンします。サーバーを完全に終了するためのコードを誰かが提案できますか?シンプルなソケットサーバーです。

これはサーバーの私のコードです:

#!/usr/bin/python
import socket
from threading import Thread

class sockServer:

    def __init__(self,port):
        self.socket= socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.socket.bind(port)
        self.socket.listen(5)

    def _run(self):
        while True:
            request, client_address =self.socket.accept()
            counter=self.req_thread(self,request)
            counter.start()

    class req_thread(Thread):
        def __init__(self,controller,request):
            Thread.__init__(self)
            self.controller=controller
            self.request=request
            self.setDaemon(True)

        def run(self):
            input=self.request.makefile('rb',0)
            output=self.request.makefile('wb',0)
            l=True
            i=0
            try:
                while l:
            l=input.readline()
            if l!="exit\r\n":
                        print "x"
                        output.write(bytes('hello\n'))
                    else:
            print "y"
                        self.request.shutdown(2)
            run=False

            except socket.error:
                pass


if __name__ == '__main__':

    import sys
    if len(sys.argv) < 3:
        print('Usage: %s [hostname] [port number]' % sys.argv[0])
        sys.exit(1)
    hostname = sys.argv[1]
    port = int(sys.argv[2])
    global run
    run=True
    while run:
        server=sockServer((hostname,port))
        server._run()

変数を使用するメソッドrunはうまくいきません!

4

2 に答える 2

2

sys.exitが機能していない場合は、osを直接呼び出すより極端なバージョンを使用できます。

import os
os._exit()

サーバーが新しいプロセスまたはスレッドをフォークした場合は、これを行う必要があります。これがあなたがしていることであり、sys.exitが期待どおりに機能しない理由です。2つの呼び出しの違いについては、次の説明を参照してください。sys.exit(0)とos._exit(0)の違いは何ですか。

于 2012-09-06T07:59:52.557 に答える
2

プログラムを完全に終了しようとしている場合は、いつでも追加import sysして、これを実行できます。

class req_thread(Thread):
    def __init__(self,controller,request):
        Thread.__init__(self)
        self.controller=controller
        self.request=request
        self.setDaemon(True)

    def run(self):
        input=self.request.makefile('rb',0)
        output=self.request.makefile('wb',0)
        l=True
        i=0
        try:
            while l:
                l=input.readline()
                if l!="exit\r\n":
                    print "x"
                    output.write(bytes('hello\n'))
                else:
                    print "y"
                    self.request.shutdown(2)
                    sys.exit(0)
                    run=False

        except socket.error:
            pass
于 2012-09-06T07:10:55.103 に答える