如何在Python中完全退出服务器?像server.shutdown()
这样的代码只会关闭传入的请求。任何人都可以建议任何代码完全退出服务器?这是一个简单的socketserver。
这是我的服务器代码:
#!/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
的方法没有任何好处!
答案 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
答案 1 :(得分:2)
如果sys.exit不起作用,那么你可以使用一个直接调用os的更极端的版本。
import os
os._exit()
如果服务器已分叉新进程或线程,则必须执行此操作。你正在做什么以及为什么sys.exit没有像你期望的那样工作。请参阅两个调用之间差异的解释:What is difference between sys.exit(0) and os._exit(0)