Celery 包含一个模块,该模块能够使用 amqp 或其他一些 celery 后端发出异步 HTTP 请求。我正在使用tornado-celery生产者进行异步消息发布。据我了解,龙卷风芹菜为此使用鼠兔。问题是如何使 celery.task.http.URL 适应龙卷风(使其非阻塞)。基本上有两个地方需要细化:
HttpDispatch.make_request()
必须使用 tornado 异步 http 客户端来实现;URL.get_async(**kw)
或者URL.post_async(**kw)
必须使用 tornado API 使用相应的非阻塞代码重新实现。例如:class NonBlockingURL(celery.task.http.URL): @gen.coroutine def post_async(self, **kwargs): async_res = yield gen.Task(self.dispatcher.delay, str(self), 'POST', **kwargs) raise gen.Return(async_res)
但我不明白如何以正确和简洁的方式做到这一点。如何使其完全像异步一样非阻塞?顺便说一句,我正在使用 amqp 后端。
请给我一个很好的指导方针,甚至更好,一个例子。