python - Tornado celery 集成黑客

标签 python celery tornado

由于没有人提供解决方案 this post再加上我迫切需要一个解决方法,这是我的情况和一些抽象的解决方案/想法供辩论。

我的堆栈:

  1. Tornado
  2. celery
  3. MongoDB
  4. Redis
  5. RabbitMQ

我的问题:找到一种方法让 Tornado 分派(dispatch) celery 任务(已解决),然后异步收集结果(有什么想法吗?)。

场景 1:(请求/响应 hack 加 webhook)

  • Tornado 收到一个(用户)请求,然后在本地内存(或 Redis)中保存一个 { jobID : (user)request} 以记住将响应传播到哪里,并使用 jobID 触发 celery 任务
  • 当 celery 完成任务时,它会在某个 url 执行 webhook 并告诉 tornado 这个 jobID 已经完成(加上结果)
  • Tornado 检索(用户)请求并将响应转发给(用户)

这会发生吗?有逻辑吗?

场景 2:( Tornado 加长轮询)

  • Tornado 分派(dispatch) celery 任务并将一些主要的 json 数据返回给客户端 (jQuery)
  • jQuery 在收到主要 json 后进行一些长轮询,比如说,每 x 微秒一次,并且 tornado 根据一些数据库标志进行回复。当 celery 任务完成时,此数据库标志设置为 True,然后 jQuery“循环”完成。

这样有效率吗?

还有其他想法/模式吗?

最佳答案

我的解决方案涉及从 Tornado 到 celery 的轮询:

class CeleryHandler(tornado.web.RequestHandlerr):

    @tornado.web.asynchronous
    def get(self):    

        task = yourCeleryTask.delay(**kwargs)

        def check_celery_task():
            if task.ready():
                self.write({'success':True} )
                self.set_header("Content-Type", "application/json")  
                self.finish()
            else:   
                tornado.ioloop.IOLoop.instance().add_timeout(datetime.timedelta(0.00001), check_celery_task)

        tornado.ioloop.IOLoop.instance().add_timeout(datetime.timedelta(0.00001), check_celery_task)

这里是 post关于它。

关于python - Tornado celery 集成黑客,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8202282/

相关文章:

python - 如何在 Python 中使用 getopt 传递灵活数量的参数?

Python 多处理 : billiard vs multiprocessing

python - 如何安排每月 1 号运行的 Celery 任务?

python - 无法让 SSL 在 Tornado 上工作

python - 我将如何使用 Python Tornado 通过 HTTP 实现 "tail"?

python - webfaction 中的 Tornado Web 服务器

python - 推荐使用 [python-lifter] 进行查询的嵌套数据结构

python - Python 中 Selenium Webdriver 测试失败时的自动截图

python - 使用 python 创建 Mysql 数据库 - 不断收到 1064 错误(...在 '%s' 附近使用正确的语法)

django - 为什么 Celery 任务测试结果不一致?