我有一个 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()