Как запланировать задачу сельдерея, не блокируя Джанго - PullRequest
0 голосов
/ 07 июня 2019

У меня есть служба Django, которая регистрирует множество клиентов и отображает полезную нагрузку, содержащую таймер (скажем, 800 с) после того, как служба должна быть приостановлена ​​клиентом (Изменить статус в состоянии SUSPENDED в MongoDB)

Я запускаю celery с rabbitmq в качестве брокера следующим образом:

celery / tasks.py `

@app.task(bind=True, name='suspend_nf')
def suspend_nf(pk):
    collection.update_one({'instanceId': str(pk)},
                          {'$set': {'nfStatus': 'SUSPENDED'}})

`

и вызываю задачу в представлении django следующим образом:

api / views.py `

def put(self, request, pk):
    now = datetime.datetime.now(tz=pytz.timezone(TIME_ZONE))
    timer = now + datetime.timedelta(seconds=response_data["heartBeatTimer"])
    suspend_nf.apply_async(eta=timer)
    response = Response(data=response_data, status=status.HTTP_202_ACCEPTED)
    response['Location'] = str(request.build_absolute_uri())

`

Что мне здесь не хватает?

Ответы [ 2 ]

0 голосов
/ 12 июня 2019

Я наконец нашел способ обойти, так как, работая над небольшим проектом, мне действительно не нужен Celery + rabbitmq, его выполняет простая Threading.

Задача выглядит следующим образом:

def suspend_nf(pk, timer):
    time.sleep(timer)
    collection.update_one({'instanceId': str(pk)},
                          {'$set': {'nfStatus': 'SUSPENDED'}})

И вызов в виде как:

timer = int(response_data["heartBeatTimer"])
thread = threading.Thread(target=suspend_nf, args=(pk, timer), kwargs={})
thread.setDaemon(True)
thread.start()
0 голосов
/ 07 июня 2019

Вы спрашиваете, что ваш просмотр полностью блокируется или представление ожидает "ETA", чтобы завершить выполнение?
Вы получили какую-либо ошибку?

Попробуйте использовать параметр countdown вместо eta.
В вашем случае это лучше, потому что вам не нужно манипулировать датами.
Как это: suspend_nf.apply_async(countdown=response_data["heartBeatTimer"])
Давайте посмотрим, будет ли ваше мнение иметь другое поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...