python3 socketserver_在单线程Python应用程序中关闭socketserver serve_forever()

相信OP的意图是从请求处理程序关闭服务器而我认为他的代码KeyboardInterrupt方面只是令人困惑的事情。

从运行服务器的shell中按ctrl-c将会成功将其关闭而不做任何特殊处理。您不能从其他shell中按ctrl-c并期望它可以工作,并且我认为的概念可能是是这个令人困惑的代码来自的地方。如OP所尝试的那样,没有必要处理KeyboardInterrupt的handle(),或者如另一个建议的那样处理serve_forever()。如果你不这样做,它会按预期工作。

这里唯一的技巧 - 它很棘手 - 告诉服务器关闭处理程序而没有死锁。

随着OP在他的代码中解释和显示,他使用的是单线程服务器,因此建议在“其他线程”中关闭它的用户没有注意。

我周围挖了SocketServer代码,并发现BaseServer类,在其努力与此模块中使用螺纹混入工作,实际上使得它与非线程服务器使用起来更加困难,用周围的一个threading.Event循环在serve_forever。

因此,我为单线程服务器编写了serve_forever的修改版本,这使得可以从请求处理程序中关闭服务器。

import SocketServer

import socket

import select

class TCPServerV4(SocketServer.TCPServer):

address_family = socket.AF_INET

allow_reuse_address = True

def __init__(self, server_address, RequestHandlerClass):

SocketServer.TCPServer.__init__(self, server_address, RequestHandlerClass)

self._shutdown_request = False

def serve_forever(self, poll_interval=0.5):

"""provide an override that can be shutdown from a request handler.

The threading code in the BaseSocketServer class prevented this from working

even for a non-threaded blocking server.

"""

try:

while not self._shutdown_request:

# XXX: Consider using another file descriptor or

# connecting to the socket to wake this up instead of

# polling. Polling reduces our responsiveness to a

# shutdown request and wastes cpu at all other times.

r, w, e = SocketServer._eintr_retry(select.select, [self], [], [],

poll_interval)

if self in r:

self._handle_request_noblock()

finally:

self._shutdown_request = False

class TCPHandler(SocketServer.BaseRequestHandler):

def handle(self):

data = self.request.recv(4096)

if data == "shutdown":

self.server._shutdown_request = True

host = 'localhost'

port = 52000

server = TCPServerV4((host, port), TCPHandler)

server.serve_forever()

如果发送字符串'shutdown'到服务器,服务器将结束其serve_forever循环。您可以使用netcat来测试:

printf "shutdown" | nc localhost 52000

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值