Cla*_*diu 17 python shutdown twisted
更新:为了便于阅读,以下是在反应器关闭之前添加回调的方法:
reactor.addSystemEventTrigger('before', 'shutdown', callable)
Run Code Online (Sandbox Code Playgroud)
原始问题如下.
如果我有一个连接到服务器的客户端,并且它在反应器主循环中等待事件的冷却,当我按下CTRL-C时,我得到一个"以另一方面的连接以非干净的方式丢失:连接丢失. " 如何设置它以便我知道何时发生KeyboardInterrupt,以便我可以进行适当的清理并彻底断开连接?或者,如果可能的话,如何实现更清晰的关闭方式,不涉及CTRL-C?
Jea*_*one 30
如果你真的,真的想要专门捕获Cc,那么你可以用通常的方式为Python应用程序执行此操作 - 用于signal.signal安装处理程序SIGINT,无论你想做什么.如果从处理程序调用任何Twisted API,请确保使用,reactor.callFromThread因为几乎所有其他Twisted API对于信号处理程序的调用都是不安全的.
但是,如果您真的只是想插入一些关闭时清理代码,那么您可能希望使用IService.stopService(或实现它的机制reactor.addSystemEventTrigger).
如果你正在使用twistd,那么使用IService.stopService很容易.您已经拥有一个Application至少附加了一个服务的对象.您可以使用自定义stopService方法添加另一个方法来执行关机工作.该方法允许返回a Deferred.如果是,则关闭进程暂停直到Deferred触发为止.这使您可以很好地清理连接,即使这涉及更多网络(或任何其他异步)操作.
如果你没有使用twistd,那么reactor.addSystemEventTrigger直接使用可能更容易.您可以安装一个关闭之前的触发器,它将在调用的相同环境IService.stopService中被调用.此触发器(只是任何可调用对象)也可以返回Deferred延迟关闭.这是通过调用reactor.addSystemEventTrigger('before', 'shutdown', callable)(在启动关闭之前的某个时间,以便在关闭确实发生时已经注册)来完成的.
service.tac提供了创建和使用自定义服务的示例.
wxacceptance.py给出了一个使用addSystemEventTrigger和延迟关闭(任意)三秒的示例.
这两种机制都会在反应堆停止时给你通知.这可能是由于Cc键击,或者可能是因为有人使用过kill -INT ...,或者可能是因为某处reactor.stop()被调用.它们都导致反应堆关闭,并且反应堆关闭始终处理关闭事件触发器.
| 归档时间: |
|
| 查看次数: |
8233 次 |
| 最近记录: |