【问题标题】:How to pass value from django's request to a periodic task in Celery?如何将 django 请求中的值传递给 Celery 中的定期任务?
【发布时间】:2014-09-12 14:09:33
【问题描述】:

我有一个关于如何从 Django 运行并将 args 传递给 celery 任务的问题。

我想要什么:

1 从提交的表单中获取关键字(hashtagName

2 将名称发送到周期性任务,以每 30 秒在页面上显示其计数。

问题:

我不清楚这应该如何运行。我应该运行: python manage.py runserver在一个终端 和python manage.py celery worker -B 在另一个终端窗口上让两个服务同时运行?

如果这是正确的方法,我如何将值从 Django 传递给 celery 任务?因为任务将在我的第二个命令后立即开始。

PS:我通读了 celery 文档,关于 periodic task 的部分对我的问题没有帮助,因为我的函数的参数来自用户输入。

谢谢!

更新:

正如下面的答案中提到的,我应该开始一个芹菜任务来收集数据。如果这是正确的方法,我应该如何启动工人?我仍然不清楚如何同时启动 celery worker 和 django 服务器。

我应该在终端中运行命令吗

$ celery -A proj worker -l info

python manage.py runserver 并在视图函数中调用taskfunction().delay

【问题讨论】:

    标签: python django web-applications celery


    【解决方案1】:

    这真的不是芹菜的工作。这适用于您可以触发的后台任务,这些任务可以独立完成 - 复杂的处理、繁重的 api 调用等。

    您需要的只是每 30 秒刷新一次页面上的信息的方法。这最好从浏览器本身完成 - 可能使用带有 setTimeout 的 JavaScript,要么触发完整页面请求,要么通过 Ajax 加载一些部分内容。

    【讨论】:

    • 正如对另一个答案的评论,我应该使用 celery 进行监控,而不是向前端发送数据。感谢您的回复!
    【解决方案2】:

    这似乎完全是解决这个问题的错误方法。

    您应该在客户端处理此定期更新,在需要时对新数据发出 AJAX 请求。

    您向常规 django 视图发出请求,每次都传递所需的用户输入。

    【讨论】:

    • 感谢您的回复。现在,据我了解,这个问题应该通过以下方法解决:1)创建一个芹菜任务来接受来自请求的args以收集数据; 2)编写一个普通的django视图函数来显示结果。显示期间,前端每30秒发送一次请求;所以我错了在哪里使用芹菜任务而不是“我应该使用芹菜”。这是一个正确的结论吗?
    • 你只会使用 celery 来安排一些昂贵的长时间运行的任务。这就是您要监控的事物的性质吗?
    • 我猜是的,我正在使用 twitter 的流 api 来监控一些 keyworkds 的外观。
    • 当关键字出现时会发生什么?
    • 当关键字出现时,更新数据库中对应的计数并继续监听直到设置为停止。
    猜你喜欢
    • 2019-11-13
    • 2018-10-07
    • 2018-10-01
    • 2016-02-28
    • 2021-12-16
    • 2014-03-12
    • 2012-03-22
    • 2018-10-19
    • 2018-02-02
    相关资源
    最近更新 更多