APScheduler在Tornado Python中运行异步函数

APScheduler在Tornado Python中运行异步函数,python,mongodb,asynchronous,tornado,apscheduler,Python,Mongodb,Asynchronous,Tornado,Apscheduler,我正在尝试开发一个小应用程序,它将从API收集天气数据。我使用APScheduler每x分钟执行一次函数。我使用Python Tornado框架 我得到的错误是: INFO Job "GetWeather (trigger: interval[0:01:00], next run at: 2015-03-28 11:40:58 CET)" executed successfully ERROR Exception in callback functools.partial(<

我正在尝试开发一个小应用程序,它将从API收集天气数据。我使用APScheduler每x分钟执行一次函数。我使用Python Tornado框架

我得到的错误是:

INFO     Job "GetWeather (trigger: interval[0:01:00], next run at: 2015-03-28 11:40:58 CET)" executed successfully
ERROR    Exception in callback functools.partial(<function wrap.<locals>.null_wrapper at 0x0335C978>, <tornado.concurrent.Future object at 0x03374430>)
Traceback (most recent call last):
  File "C:\Python34\Lib\site-packages\tornado\ioloop.py", line 568, in _run_callback
    ret = callback()
  File "C:\Python34\Lib\site-packages\tornado\stack_context.py", line 275, in null_wrapper
    return fn(*args, **kwargs)
greenlet.error: cannot switch to a different thread
知道我做错了什么吗?正如我在APScheduler代码中看到的,Tornado Scheduler()在Tornado IOLoop中运行。。。()

哦!!我忘了说这个想法是能够通过APScheduler或手动执行任务


非常感谢

在我看来就像TornadScheduler,尽管它与iLoop集成,但它:

Motor不喜欢在同一进程中的多个线程上运行——我只测试在主线程上使用Motor的用例


我认为您应该使用Tornado PeriodicCallback而不是ApsScheduler,或者您应该使用PyMongo和ApsScheduler(因此PyMongo在后台线程上运行)而不是Motor。

在我看来就像Tornado调度器,尽管它与iLoop集成,但它:

Motor不喜欢在同一进程中的多个线程上运行——我只测试在主线程上使用Motor的用例


我认为您应该使用Tornado PeriodicCallback而不是ApsScheduler,或者您应该使用PyMongo和ApsScheduler(因此PyMongo在后台线程上运行)而不是Motor。

在我看来就像Tornado调度器,尽管它与iLoop集成,但它:

Motor不喜欢在同一进程中的多个线程上运行——我只测试在主线程上使用Motor的用例


我认为您应该使用Tornado PeriodicCallback而不是ApsScheduler,或者您应该使用PyMongo和ApsScheduler(因此PyMongo在后台线程上运行)而不是Motor。

在我看来就像Tornado调度器,尽管它与iLoop集成,但它:

Motor不喜欢在同一进程中的多个线程上运行——我只测试在主线程上使用Motor的用例


我认为您应该使用Tornado PeriodicCallback而不是ApsScheduler,或者使用PyMongo和ApsScheduler(因此PyMongo在后台线程上运行)而不是Motor。

默认情况下,Tornado Scheduler在线程池中运行计划任务。但是,您的特定任务使用IOLoop,因此希望在同一线程中运行。要解决这个问题,您可以使用tornado IOLoop的add_callback()方法来计划任务,以便尽快在IOLoop的线程中运行

像这样:

def your_scheduled_task():
    IOLoop.instance().add_callback(your_real_task_function)
或者更好:

scheduler.add_job(IOLoop.instance().add_callback, 'interval', minutes=1, args=[GetWeather])

默认情况下,TornadScheduler在线程池中运行计划任务。但是,您的特定任务使用IOLoop,因此希望在同一线程中运行。要解决这个问题,您可以使用tornado IOLoop的add_callback()方法来计划任务,以便尽快在IOLoop的线程中运行

像这样:

def your_scheduled_task():
    IOLoop.instance().add_callback(your_real_task_function)
或者更好:

scheduler.add_job(IOLoop.instance().add_callback, 'interval', minutes=1, args=[GetWeather])

默认情况下,TornadScheduler在线程池中运行计划任务。但是,您的特定任务使用IOLoop,因此希望在同一线程中运行。要解决这个问题,您可以使用tornado IOLoop的add_callback()方法来计划任务,以便尽快在IOLoop的线程中运行

像这样:

def your_scheduled_task():
    IOLoop.instance().add_callback(your_real_task_function)
或者更好:

scheduler.add_job(IOLoop.instance().add_callback, 'interval', minutes=1, args=[GetWeather])

默认情况下,TornadScheduler在线程池中运行计划任务。但是,您的特定任务使用IOLoop,因此希望在同一线程中运行。要解决这个问题,您可以使用tornado IOLoop的add_callback()方法来计划任务,以便尽快在IOLoop的线程中运行

像这样:

def your_scheduled_task():
    IOLoop.instance().add_callback(your_real_task_function)
或者更好:

scheduler.add_job(IOLoop.instance().add_callback, 'interval', minutes=1, args=[GetWeather])

调查得越多,我相信问题在于模拟使用电机和APScheduler,但我不知道为什么…调查得越多,我相信问题在于模拟使用电机和APScheduler,但我不知道为什么…调查得越多,我相信问题在于模拟使用电机和APScheduler,但我不知道为什么…调查更多我相信问题在于模拟使用Motor和APScheduler,但我不知道为什么…如果没有使用高级调度程序功能,PeriodicCallback确实会更简单。谢谢大家!我只需要安排一些任务在午夜运行,这就是为什么我想包括APScheduler。我希望任务在特定时间执行。如果没有使用高级调度程序功能,PeriodicCallback确实会更简单。谢谢你们!我只需要安排一些任务在午夜运行,这就是为什么我想包括APScheduler。我希望任务在特定时间执行。如果没有使用高级调度程序功能,PeriodicCallback确实会更简单。谢谢你们!我只需要安排一些任务在午夜运行,这就是为什么我想包括APScheduler。我希望任务在特定时间执行。如果没有使用高级调度程序功能,PeriodicCallback确实会更简单。谢谢你们!我只需要安排一些任务在午夜运行,这就是为什么我想包括APScheduler。我希望任务在特定的时间执行。谢谢Alex!我不知道如何实施你提出的解决方案。我不想听起来像是机会主义者,但你能举个例子吗?我一直在尝试一些东西,但我没有得到任何工作。提前谢谢!谢谢你,亚历克斯!我不知道如何实施你提出的解决方案。我不想听起来像是机会主义者,但你能举个例子吗?我一直在尝试一些东西,但我没有得到任何工作。提前谢谢!谢谢你,亚历克斯!我不知道如何实施你提出的解决方案。我不想听起来像是机会主义者,但你能举个例子吗?我一直在尝试一些东西,但我没有得到任何工作。提前谢谢!谢谢你,亚历克斯!我不知道如何实施你提出的解决方案。我不想听起来像是机会主义者,但你能举个例子吗?我一直在尝试一些东西,但我没有得到任何工作。谢谢