Python 如何在ApsScheduler中使用Tornado?

Python 如何在ApsScheduler中使用Tornado?,python,multithreading,concurrency,tornado,apscheduler,Python,Multithreading,Concurrency,Tornado,Apscheduler,我正在运行python的apscheduler,并定期想在一些http资源上做一些工作,这将涉及使用tornado的AsyncHttpClient作为计划作业。每项工作将做几个职位。当每个http请求响应时,就会调用一个回调(我认为Tornado使用future来实现这一点) 我在这里关心线程安全,因为Apscheduler在不同的线程中运行作业。我还没有找到一个解释得很好的例子,说明在这种情况下,如何最好地跨多个线程使用tornado 如何以这种方式将apscheduler与tornado结合

我正在运行python的
apscheduler
,并定期想在一些http资源上做一些工作,这将涉及使用tornado的
AsyncHttpClient
作为计划作业。每项工作将做几个职位。当每个http请求响应时,就会调用一个回调(我认为Tornado使用
future
来实现这一点)

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

如何以这种方式将
apscheduler
tornado
结合使用?

具体关注事项:

  • 使用哪种tornado iLoop?文档说,
    AsyncHTTPClient
    “工作起来很神奇”。嗯,魔法吓到我了。我需要在当前线程中使用
    AsyncHTTPClient
    ,还是可以使用主线程(可以指定)

  • 我的回调在使用哪个ioloop时是否存在线程安全问题

  • 我不清楚线程完成后会发生什么,但仍然需要调用挂起的回调/未来。这里有问题吗

  • 既然apscheduler是作为进程中的线程运行的,python拥有GIL,那么从主线程获得一个IOLoop与从不同线程获得多个循环(就性能而言)是否几乎相同

  • Tornado的所有实用程序都围绕Tornado的IOLoop工作——这也包括AsyncHTTPClient。并且IOLoop不被认为是线程安全的。因此,从运行主IOLoop的线程以外的任何线程运行AsyncHTTPClient不是一个好主意。有关如何使用IOLoop的更多详细信息,请参阅

  • 如果您使用
    tornado.ioloop.ioloop.instance()
    ,那么如果您不打算向主线程的ioloop添加回调,那么我想您会这样做。您可以使用
    tornado.ioloop.ioloop.current()
    为正确的线程正确引用正确的ioloop实例。你将不得不做太多的簿记工作,从另一个非主线程的IOLoop向一个非主线程的IOLoop添加一个回调——这将变得太混乱

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

  • 老实说,我不认为在Tornado中使用线程有什么意义。除非您在PyPy上运行,否则不会有任何性能提升,我不确定Tornado是否能很好地使用PyPy(并不是所有的东西都能在PyPy上运行,老实说,我也不知道Tornado)。如果你的Tornado应用程序是webserver,那么你最好有多个进程,并使用Nginx作为代理和LB。由于你引入了
    apscheduler
    ,我建议使用Ioop,它做的事情与你需要的差不多,而且它是Tornado的本机,可以更好地使用它。回调无论如何都很难调试。将它与Python的线程技术结合起来,您可能会陷入一片混乱。如果你准备考虑另一个选项,只要把所有的异步处理从这个过程中移开,它会让生活变得简单多了。想一想芹菜之类的东西


  • 嘿,我的回答对你有什么帮助吗?如果您需要更多信息,请发表评论。谢谢您提供更多信息。此后,我开始通过gevent使用greenlets,并使用最近的ApsScheduler版本,该版本现在提供gevent兼容性。也可以在多个tornado进程上分散负载。在多个进程上分散负载比在tornado中使用线程要容易得多。即使是明智的管理,这也是一个更明智的选择。如果我的回答回答了你以前的要求/问题,如果你不介意的话,请你继续接受我的回答。