使用twisted和systemd处理缓存预热

时间:2017-03-22 21:50:54

标签: twisted

我有一个简单的扭曲应用程序,我使用systemd服务运行,执行脚本,随后执行.tac文件。

应用程序的结构为JSON RPC端点(fastjsonrpc),内置于t.w.s.Resource,位于t.w.s.Site中,并提供给t.a.i.TCPServer,并将整个内容打包到t.a.Application中。这很好。

我遇到麻烦的地方是我在启动时尝试预热缓存。这个预热过程非常慢(约300秒),并使systemd超时并终止进程。增加超时并不是一个可行的选择,因为我不希望这会阻止系统启动。

在Apache和wsgi中,在Flask上运行的单独堆栈中使用类似代码。该服务器自动启动并让systemd继续运行,同时花费时间构建缓存。这种行为对我来说没问题。

我尝试在t.w.r.Resource的setup函数中使用以下函数调用warmup函数:

reactor.callLater(1, ep.warmup, None)

我还没有尝试在systemd中使用它,并且已经在命令行上直接测试了twistd。服务器按预期工作,但它不再响应SIGINT(^ C)。删除callLater是让服务器响应SIGINT所需的全部内容。

如果直接调用预热函数(不是通过callLater调用,即使systemd在等待预热完成时放弃的安排),结果服务器也会继续响应SIGINT。

  1. 有没有更好/更好的方法来处理这种长时间运行的预热代码?
  2. 为什么会扭曲/反应堆不响应SIGINT?我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:0)

Twisted是一个单线程的东西。这听起来像是你的"缓存预热"代码阻塞反应堆300秒。解决此问题的一种简单方法是使用deferToThread让它在不阻塞反应堆的情况下运行。