Почему состояния задачи Celery чередуются между PENDING и STARTED? - PullRequest
0 голосов
/ 05 сентября 2018

Я развертываю приложение фляги с использованием сельдерея на рабочем, для которого выделены некоторые конфигурации:

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

...