由于没有人提供解决方案 this post再加上我迫切需要一个解决方法,这是我的情况和一些抽象的解决方案/想法供辩论。
我的堆栈:
- Tornado
- celery
- MongoDB
- Redis
- 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/