如何在不阻止 Django 的情况下安排芹菜任务



我有一个 Django 服务,它注册了很多客户端并渲染一个包含计时器的有效负载(假设 800s(,之后客户端应该被服务挂起(在 MongoDB 中将状态注册更改为暂停(

我用兔子作为经纪人经营芹菜,如下所示:

芹菜/任务.py

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

并在 Django 视图中调用任务,如下所示:

接口/视图.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())

我在这里错过了什么?

您是要求视图完全阻止还是视图正在等待"ETA"完成执行?
您是否收到任何错误?

尝试使用countdown参数而不是eta
在您的情况下,它更好,因为您不需要操作日期。
像这样:suspend_nf.apply_async(countdown=response_data["heartBeatTimer"])
让我们看看您的视图是否会有一些不同的行为。

我终于找到了一个解决方法,因为从事一个小项目,我真的不需要 Celery + rabbitmq 一个简单的线程来完成这项工作。

任务如下所示:

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()

相关内容

  • 没有找到相关文章

最新更新