【问题标题】:How to use Tornado with APScheduler?如何将 Tornado 与 APScheduler 一起使用?
【发布时间】:2013-05-05 21:03:34
【问题描述】:

我正在运行 python 的 apscheduler 并定期想要做一些工作 POST 到一些 http 资源,这将涉及使用 tornado 的 AsyncHttpClient 作为计划的工作。每个工作都会做几个 POST。当每个 http 请求响应时,就会调用一个回调(我认为 Tornado 使用 future 来完成此操作)。

我在这里关心线程安全,因为Apscheduler 在各种线程中运行作业。我还没有找到一个解释清楚的例子,说明在这种情况下如何最好地跨多个线程使用龙卷风。

我怎样才能以这种方式最好地使用apschedulertornado

具体问题:

  1. 要使用哪个龙卷风 ioloop?文档说AsyncHTTPClient“像魔术一样工作”。好吧,魔法吓到我了。我需要在当前线程中使用AsyncHTTPClient 还是可以使用主线程(可以指定)?

  2. 对于我使用的 ioloop,我的回调是否存在线程安全问题?

  3. 我不清楚当线程完成但仍有待调用的回调/未来需要调用时会发生什么。这里有问题吗?

  4. 由于 apscheduler 作为进程内线程运行,而 python 具有 GIL,那么从主线程拥有一个 IOLoop 是否几乎相同 - 而不是来自不同线程的多个循环(相对于性能)?

【问题讨论】:

  • 嘿,我的回答对您有任何帮助吗?如果您需要更多相关信息,能否发表评论?

标签: python multithreading concurrency tornado apscheduler


【解决方案1】:
  1. Tornado 的所有实用程序都围绕 Tornado 的 IOLoop 工作 - 这也包括 AsyncHTTPClient。并且 IOLoop 不被认为是线程安全的。因此,从运行主 IOLoop 的线程以外的任何线程运行 AsyncHTTPClient 都不是一个好主意。有关如何使用 IOLoop 的更多详细信息,read this

  2. 如果您使用tornado.ioloop.IOLoop.instance(),那么如果您的意图不是向主线程的 IOLoop 添加回调,我想您会这样做。您可以使用tornado.ioloop.IOLoop.current() 为正确的线程正确引用正确的 IOLoop 实例。而且你必须做太多的簿记才能从另一个非主线程的 IOLoop 添加一个回调到一个非主线程的 IOLoop - 它会变得太混乱。

  3. 我不太明白。但按照我的理解,有两种情况。您正在谈论带有 IOLoop 或没有 IOLoop 的线程。如果线程没有运行 IOLoop,那么在线程完成任何操作后,IOLoop 在其他线程(可能是主线程)中必须执行的任何回调都将被执行。另一种情况是您正在谈论的线程正在运行 IOLoop。除非您停止 IOLoop,否则该线程将不会完成。因此,回调的执行实际上取决于您何时停止 IOLoop。

  4. 老实说,我认为在 Tornado 中使用线程并没有多大意义。除非你在 PyPy 上运行,否则不会有任何性能提升,我不确定 Tornado 是否能很好地使用它(并不是所有的东西都可以在它上面工作,老实说我也不知道 Tornado)。如果您的 Tornado 应用程序是网络服务器并使用 Nginx 作为代理和 LB,那么您也可能有多个进程。既然你已经引入了apscheduler,我建议使用 IOLoop 的add_timeout,它的功能与你需要的几乎相同,并且它是 Tornado 的原生工具,可以更好地使用它。无论如何,回调很难调试。将它与 Python 的线程结合起来,你可能会遇到很多麻烦。如果您准备考虑另一种选择,只需将所有异步处理移出此过程 - 这将使生活变得更加轻松。想想像 Celery 这样的东西。

【讨论】:

  • 感谢您提供更多信息。从那以后,我开始转向通过 gevent 使用 greenlets - 并使用现在提供 gevent 兼容性的最新版本的 APScheduler。还将负载分散到多个龙卷风过程中。
  • 在多个进程上分散负载比在 Tornado 中使用线程要容易得多。即使管理明智,它也是一个更明智的选择。如果我的回答回答了您较早的要求/问题,如果您不介意,请继续接受它作为答案。
猜你喜欢
  • 2015-06-28
  • 2012-09-15
  • 2011-02-01
  • 2021-03-31
  • 2012-01-10
  • 1970-01-01
  • 1970-01-01
  • 2011-12-29
  • 2021-06-23
相关资源
最近更新 更多