Сельдерей включает в себя модуль, который может создавать асинхронные HTTP-запросы с использованием amqp или какого-либо другого ферментера. Я использую tornado-celery производителя для асинхронной публикации сообщений. Как я понял, tornado-celery использует pika для этого. Вопрос в том, как адаптировать celery.task.http.URL для торнадо (сделать его неблокирующим). В основном есть два места, которые нужно уточнить:
-
HttpDispatch.make_request()
должны быть реализованы с использованием tornado async http client; -
URL.get_async(**kw)
илиURL.post_async(**kw)
должен быть переопределен соответствующим неблокирующим кодом с использованием 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.
Пожалуйста, предоставьте мне хороший ориентир или даже лучше, пример.