我正在寻找一种方法来检查基于twisted的程序的状态,这样我就可以确定连接的客户机的数量,并查看我收集的其他指标(例如建立连接的时间或上次联系的时间)。
我的想法是给进程添加一个SIGUSR1的信号处理程序,这样当进程接收到它时,它将把状态转储到一个已知位置的文件中。这有几个问题:
Twisted用它自己的处理程序重写信号处理程序,因为当信号到达时,进程在stdout上以“usersignal1received”结束,并且不调用我的代码
考古研究表明,twisted不会重写SIGINT的处理程序;但事实并非如此(python 2.7.11和twisted 16.1.1),进程在stdout上的“keyboardinterrupt”退出。
其他资源建议reactor.run(installSignalHandlers=False)reactor.run(installSignalHandlers=0),但这似乎没有效果。
因此我有几个问题:
在思想上正确处理信号的方法是什么?(如果可能的话)
为twisted服务器实现这种“状态内省”功能的推荐方法是什么?(我想让它监听另一个端口上的TCP连接,并将其用作POSIX信号的替代-但我觉得我把事情弄得太复杂了)。
感谢您花时间阅读本文,我期待着这个星球蜂巢思维的暗示。
这是邮件列表中的相关摘录:
>如果你这样做,你将打破产卵过程。幸运的是,如果你
>安装sigint处理程序,twisted不会踩到它:
>魅力之星:~$python
>蟒蛇2.5.2(r252:60911,2008年7月31日,17:28:52)[GCC 4.2.3
>(ubuntu 4.2.3-2ubuntu7)关于linux2
>键入“帮助”、“版权”、“信用”或“许可证”以获取详细信息。
>>>>定义F(*A):
>…打印“sigint”
>…>>>输入信号
>>>>信号.signal(signal.sigint,f)
>
>>>>从twisted.internet导入reactor
>>>>反应堆运行()
>西格特
>西格特
>西格特
>退出

最佳答案

从Twisted17.1开始,只有twistd安装了SIGUSR1处理程序,如果您已经为该信号安装了处理程序,它将跳过安装。
向进程发送sigusr1时在stdout上看到的消息:

user signal 1 received

是操作系统的默认系统处理程序。默认的行为是退出进程。这表明您和twisted都没有安装SIGUSR1的处理程序。似乎处理程序安装代码在您认为它正在运行并且没有使用twistd时没有运行。
然而。。。
在思想上正确处理信号的方法是什么?(如果可能的话)
很可能根本不可能。信号是兔子洞。如果你在这件事上有任何选择,离他们远点。在任何python程序中引入异步信号传递都是令人担忧的。在某些情况下,正确可靠地做是可能的,但我不会打赌。由于posix的缺点和python在这些基础上增加的额外的复杂性,信号与多线程有着复杂的交互。信号处理程序是一个共享的全局资源(如您所注意到的),因此在尝试使用它们的不同代码基之间存在复杂的交互。
最后,有一系列的替代方案可供您从哪方面解决这些问题。
为twisted服务器实现这种“状态内省”功能的推荐方法是什么?(我想让它监听另一个端口上的TCP连接,并将其用作POSIX信号的替代-但我觉得我把事情弄得太复杂了)。
使用posix信号以外的机制可能看起来更复杂,但我建议它严格来说更简单,尽管它可能需要稍多的输入。
我没有“状态内省”的一般建议,但是这里有一个针对这个案例的具体建议:向流程中添加一个http服务器。
例如,这是多么简单:
from json import dumps

from twisted.web.server import Site
from twisted.web.resource import Resource
from twisted.internet.endpoints import serverFromString

class StateResource(Resource):
    def render(self, request):
        return dumps({"your": "state info"})

root = Resource()
root.putChild(b"", StateResource())
serverFromString("tcp:12345").listen(Site(root))

是的,比等效的基于信号的代码长10行。但是,它没有奇怪的多线程或多进程交互。它是独立于平台的。它不会踩踏共享资源(也不会踩踏),除了我随机选择的那个TCP端口(如果您不喜欢,您可以通过Unix套接字运行它,如果这对您很重要,还可以授予访问控制)。
显然,当你想在你的应用程序中添加一个健康检查以便你的主管可以监控它时,这才是最好的解决方案。然后您需要添加一个metrics reporter,这样您的监控系统就可以将该数据拉入并呈现给您的sres或ops团队。等等。一个可以处理额外功能的基于信号的解决方案变得更加复杂,我怀疑,最终的sloc总数要比http解决方案高。也就是说,http服务器可以很好地适应新的功能需求。基于信号的解决方案不能。

关于python - 如何在Twisted程序中添加SIGUSR1处理程序?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42893108/

10-12 07:39
查看更多