Я развертываю приложение фляги с использованием сельдерея на рабочем, для которого выделены некоторые конфигурации:
celery.conf.task_time_limit = 99
celery.conf.task_track_started = True
# recommended settings by CloudAMQP...
celery.conf.broker_pool_limit = 3 # Will decrease connection usage
celery.conf.broker_heartbeat = None # if None: We're using TCP keep-alive instead
celery.conf.broker_connection_timeout = 30 # May require a long timeout due to Linux DNS timeouts etc
celery.conf.event_queue_expires = 60 # Will delete all celeryev. queues without consumers after 1 minute.
celery.conf.worker_prefetch_multiplier = 1 # Disable prefetching, it's causes problems and doesn't help performance
celery.conf.result_expires = 40000 # half a day expiry for backend result messages
broker_url = 'amqp://guest:guest@localhost:5672//' # real values in production.
result_backend = 'rpc://'
После запуска одной асинхронной задачи через URL-адрес API-интерфейса AJAX в браузере клиента я начинаю опрос с помощью task.id, чтобы проверить ее завершение. Обычно это занимает около 10 секунд ...
var apiGetStatus = function() {
self = this;
$.ajax({
dataType: "json",
url: self.calcApiIdUrl,
method: "GET",
data: {},
success: function (data) {
console.log("DEV: url: ", self.calcApiIdUrl);
console.log('DEV: long polling data state..', data["state"]);
if (data["state"] != "PENDING" && data["state"] != "STARTED") {
if (data["state"] == "SUCCESS") {
// good.
self.calcApiStatus = data["status"];
} else {
// bad.
self.calcApiStatus = data["status"]
}
} else {
// continue polling in 1 second..
self.calcApiStatus = data["status"];
setTimeout(function () {
self.apiGetStatus();
}, 1000);
}
},
error: function () {
// handle.
}
})
}
Когда я выполняю это в процессе разработки на своем локальном сервере с сервером rabbitMQ, я получаю состояние задачи как первоначально ОЖИДАЕМЫЙ, затем она запускается и остается такой до УСПЕХА.
Когда я выполняю это на Heroku с cloudAMQP в качестве посредника, состояние задачи колеблется между PENDING и STARTED, однако журналы не указывают на то, что задача выполняется повторно, просто кажется, что она отображается как PENDING, когда она фактически запущена. Когда я использую Redis в качестве result_backend, я не получаю эту ошибку.
Есть мысли, почему происходит это чередование? У меня нет идей .. ![enter image description here](https://i.stack.imgur.com/IixOJ.png)