【问题标题】:How to completely exit a server in python?如何在python中完全退出服务器?
【发布时间】:2012-09-06 07:05:38
【问题描述】:

如何在 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 的方法没有任何好处!

【问题讨论】:

  • 修复代码格式

标签: python


【解决方案1】:

如果 sys.exit 不起作用,那么您可以使用更极端的版本,直接调用 os。

import os
os._exit()

如果服务器派生了一个新进程或线程,您将不得不这样做。这就是您正在做的事情以及为什么 sys.exit 没有按预期工作。这两个调用的区别见这个解释:What is difference between sys.exit(0) and os._exit(0)

【讨论】:

    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      • 2014-03-07
      • 2023-02-18
      • 2012-01-04
      • 2016-11-11
      相关资源
      最近更新 更多