twisted:正确捕捉键盘中断和关机

2024-05-15 09:40:25 发布

您现在位置:Python中文网/ 问答频道 /正文

更新:为了便于阅读,下面是如何在反应堆关闭之前添加回调:

reactor.addSystemEventTrigger('before', 'shutdown', callable)

下面是最初的问题。


如果我有一个客户机连接到一个服务器,它在反应堆主循环中等待事件,当我按下CTRL-C时,我得到一个“到另一边的连接以非干净的方式丢失:连接丢失”。我如何设置它,以便我知道何时发生键盘中断,以便我可以进行正确的清理和干净地断开连接?或者,如果可能的话,我如何实现一种不涉及CTRL-C的更干净的关机方式?


Tags: 服务器客户机方式事件键盘reactorctrlcallable
2条回答

如果您真的非常想特别捕获C-C,那么您可以按照Python应用程序的通常方式来执行此操作—使用signal.signalSIGINT安装一个处理程序,该处理程序可以执行您想执行的任何操作。如果从处理程序调用任何Twisted api,请确保使用reactor.callFromThread,因为几乎所有其他Twisted api对于从信号处理程序调用都是不安全的。

但是,如果您真的只想插入一些关闭时间清理代码,那么您可能需要使用IService.stopService(或者实现它的机制,reactor.addSystemEventTrigger)。

如果您使用的是twistd,那么使用IService.stopService很容易。您已经有一个至少附加了一个服务的Application对象。您可以使用自定义的stopService方法添加另一个方法来完成关闭工作。允许该方法返回Deferred。如果是,那么关闭进程将暂停,直到Deferred触发为止。这样可以很好地清理连接,即使这涉及到更多的网络(或任何其他异步)操作。

如果不使用twistd,那么直接使用reactor.addSystemEventTrigger可能更容易。您可以在shutdown触发器之前安装一个触发器,它将在相同的情况下被调用IService.stopService。这个触发器(只是任何可调用的对象)也可以返回Deferred来延迟关机。这是通过调用reactor.addSystemEventTrigger('before', 'shutdown', callable)来完成的(在启动关机之前的某个时间,这样每当关机发生时就已经注册了)。

service.tac给出了创建和使用自定义服务的示例。

wxacceptance.py给出了一个使用addSystemEventTrigger并将关机延迟(任意)三秒的示例。

当反应堆停止时,这两种机制都会给你通知。这可能是由于C-C按键,也可能是因为有人使用了kill -INT ...,或者可能是因为调用了reactor.stop()。它们都会导致反应堆停堆,反应堆停堆总是处理停堆事件触发器。

我不确定你说的是你写的客户机还是服务器。

不管怎样,“CTRL-C”没什么问题。

如果您将服务器作为应用程序编写。来自twisted.application.service.Service的子类并定义startServicestopService。维护活动协议实例的列表。使用stopService穿过它们并优雅地关闭它们。

如果您有一个客户机,也可以将Service子类化,但是在这个函数中使用reactor.addSystemEventTrigger('before','shutdown',myCleanUpFunction)和优雅地关闭连接会更简单。

相关问题 更多 >