Python3 - 打破了一个全能的尝试块

时间:2015-04-22 06:13:07

标签: python multithreading exception-handling socketserver

我刚刚重写了类似于基本python服务器的东西 (https://docs.python.org/3/library/socketserver.html)因为我认为我需要。

我的问题是,是吗?

我想要做的是在收到某个请求时停止处理程序并退出服务器循环(停止服务器请求,如果你愿意的话)。 最初,我尝试通过抛出异常来打破服务器循环,但事实证明socketserver处理程序的运行方式是在" try catch-all expect" block,这意味着在处理程序内部抛出的异常不会传播到处理程序调用函数之外(具有catch-all异常块的函数)。

python还有一个可以穿透try-catch_all-expect块的longjump机制,或者我可以在一个线程中运行serve_forever_loop,然后从处理程序中执行Thread.current.kill()之类的操作(我该怎么做呢?)。

1 个答案:

答案 0 :(得分:1)

据我所知,在引发异常时无法跳过堆栈帧。

但是,如果您真的需要此功能,您可以找到代码的一部分将其他部分发送到其他部分的其他方法。如果处理程序和服务器都在同一个解释器实例中运行(即不在单独的线程中),则可以让处理程序更改主服务器循环可访问的某个变量,服务器循环将检查该变量。如果您使用不同的解释器,则可以让处理程序写入服务器循环监视的日志文件。日志文件的想法是一种hackish,但无论如何,对于服务器而言,日志记录是一件好事。