如何在不阻塞django的情况下安排芹菜任务
How to schedule a celery task without blocking django
我有一个 Django 服务,它注册了很多客户端并呈现了一个包含计时器(比如说 800 秒)的负载,之后客户端应该被服务暂停(在 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())
`
我在这里错过了什么?
你是问你的视图完全阻塞还是视图正在等待 "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()
我有一个 Django 服务,它注册了很多客户端并呈现了一个包含计时器(比如说 800 秒)的负载,之后客户端应该被服务暂停(在 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())
`
我在这里错过了什么?
你是问你的视图完全阻塞还是视图正在等待 "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()