我正在运行python的apscheduler,并定期想对一些http资源进行开机自检,这将涉及使用 Tornado 的AsyncHttpClient作为计划作业。每个作业将执行多个POST。当每个http请求响应时,便会调用回调(我认为Tornado使用future来完成此操作)。

我在这里担心线程安全,因为Apscheduler在各种线程中运行作业。我无法找到一个很好解释的示例,说明在这种情况下如何最好在多个线程之间使用 Tornado 。

如何以这种方式最好地将apschedulertornado一起使用?

具体问题:

  • 要使用哪个 Tornado ioloop?文档说AsyncHTTPClient“像魔术一样工作”。好吧,魔术吓到我了。我需要在当前线程中使用AsyncHTTPClient还是可以使用主要线程(可以指定)?
  • 关于使用哪个ioloop,我的回调函数是否存在线程安全问题?
  • 我不清楚一个线程完成后会发生什么,但是仍然有一个待处理的回调/功能需要调用。这里有问题吗?
  • 由于apscheduler是作为进程内线程运行的,而python具有GIL,那么从主线程中获得一个IOLoop几乎是一样的-与来自不同线程的多个循环(就性能而言)相反?
  • 最佳答案

  • Tornado的所有实用程序都可以在Tornado的IOLoop周围工作-这也包括AsyncHTTPClient。而且IOLoop不被认为是线程安全的。因此,从运行主IOLoop的线程以外的任何线程运行AsyncHTTPClient并不是一个好主意。有关如何使用IOLoop的更多详细信息,read this
  • 如果您使用tornado.ioloop.IOLoop.instance(),那么我想如果您的意图是不向主线程的IOLoop添加回调。您可以使用tornado.ioloop.IOLoop.current()为正确的线程正确引用正确的IOLoop实例。而且您将不得不做大量的记账工作,以从另一个非主线程的IOLoop向一个非主线程的IOLoop添加一个回调-这太困惑了。
  • 我不太明白。但是据我了解,有两种情况。您正在谈论的是带有IOLoop或不带有IOLoop的线程。如果线程没有运行IOLoop,则在完成该线程之后,IOLoop必须在其他某个线程(也许是主线程)中执行任何回调。另一种情况是您正在谈论的线程正在运行IOLoop。然后,除非您停止了IOLoop,否则线程将无法完成。因此,回调的执行实际上取决于停止IOLoop的时间。
  • 老实说,我认为在Tornado中使用线程没有多大意义。除非您在PyPy上运行,否则不会有任何性能提升,我不确定Tornado是否可以很好地玩(不是所有的事情都可以在它上面运行,并且说实话,我也不了解Tornado)。如果您是Web服务器并且使用Nginx作为代理和LB,则您可能还要对Tornado应用进行多个处理。由于您已经引入了apscheduler,因此我建议您使用IOLoop的add_timeout,它可以完成您所需的几乎所有操作,并且它是Tornado的 native ,可以更好地使用它。无论如何,回调都是很难调试的。将其与Python的线程结合使用,可能会造成很大的困惑。如果您准备考虑其他选择,只需将所有异步处理移出该流程即可,这将使工作变得更加轻松。想想像 celery 这样的东西。
  • 关于python - 如何在APScheduler中使用Tornado?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16389125/

    10-12 20:21