【发布时间】:2017-03-22 21:50:53
【问题描述】:
我有一个简单的扭曲应用程序,我使用 systemd 服务运行它,执行一个脚本,随后执行一个 .tac 文件。
应用程序构造为 JSON RPC 端点 (fastjsonrpc),内置于 t.w.r.Resource 中,该资源位于 t.w.s.Site 中,并为 t.a.i.TCPServer 提供服务,并将整个内容打包到 t.a.Application 中。这很好用。
当我尝试在启动时预热缓存时,我确实遇到了麻烦。这个预热过程非常慢(约 300 秒),并且会使 systemd 超时并终止该进程。增加超时并不是一个真正可行的选择,因为我不希望这会阻止系统启动。
在 Apache 和 wsgi 中运行在 Flask 上的单独堆栈中使用了类似代码。该服务器会自行启动并让 systemd 继续运行,同时它会花时间构建缓存。这种行为对我来说很好。
我尝试在 t.w.r.Resource 的设置函数中使用以下内容调用预热函数:
reactor.callLater(1, ep.warmup, None)
我还没有尝试在 systemd 中使用它,而是直接在命令行上从 twistd 中测试它。服务器确实按预期工作,但是它不再响应 SIGINT (^C)。删除 callLater 就是让服务器响应 SIGINT 所需的全部内容。
如果直接调用预热函数(不是通过 callLater,即在等待预热完成时让 systemd 放弃的安排),生成的服务器也会继续响应 SIGINT。
- 是否有更好/更好的方法来处理这种长时间运行的预热代码?
- 为什么 twistd / reactor 不响应 SIGINT?我在这里遗漏了什么吗?
【问题讨论】:
标签: twisted