【问题标题】:Handling cache warm-up with twisted and systemd使用 twisted 和 systemd 处理缓存预热
【发布时间】: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。

  1. 是否有更好/更好的方法来处理这种长时间运行的预热代码?
  2. 为什么 twistd / reactor 不响应 SIGINT?我在这里遗漏了什么吗?

【问题讨论】:

    标签: twisted


    【解决方案1】:

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

    【讨论】:

    • 我认为它在 300 秒内阻塞反应器没有问题,但在那之后我需要反应器正常响应。否则反应器正常工作,但不再响应 SIGINT/SIGTERM,需要停止 SIGKILL。 deferToThread 不太适合我,因为我的缓存是相当复杂的 python 对象网络。
    • 另外,您可以重新编写“预热”例程以返回延迟,从而定期将控制权交给反应堆。我不确定这是否/如何与您看到的信号行为相关..但这是一种更好的方法。一种方法是只使用@inlineCallbacks 并“yield”每这么多循环迭代(如果它是一个循环)。
    猜你喜欢
    • 2014-10-14
    • 1970-01-01
    • 2014-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多