当前位置: 首页 > 知识库问答 >
问题:

芹菜:为什么我需要一个经纪人来完成周期性任务?

窦成荫
2023-03-14

我有一个标准脚本,可以抓取页面,启动与数据库的连接,并将数据库写入其中。我需要它在x小时后定期执行。我可以使用bash脚本和伪代码来做到这一点:

while true
do
  python scraper.py
  sleep 60*60*x
done

根据我对消息代理的了解,它们用于将“信号”从一个正在运行的程序发送到另一个程序,原则上就像HTTP一样。就像我有一段接受用户电子邮件ID的代码一样,它将带有email-id的信号发送到另一段将发送电子邮件的代码。

我需要芹菜来运行heroku的定期任务。我已经在单独的服务器上有一个mongodb。为什么我需要为rabbitmq或redis运行另一个服务器?没有经纪人我可以用芹菜吗?

共有3个答案

甄文彬
2023-03-14

对于这样的应用程序,它更好地使用Django后台任务,

从PyPI安装:

pip install django-background-tasks

添加到INSTALLED_APPS:

INSTALLED_APPS = (
    # ...
    'background_task',
    # ...
)

迁移您的数据库:

python manage.py makemigrations background_task
python manage.py migrate

要注册任务,请使用背景装饰器:

from background_task import background
from django.contrib.auth.models import User

@background(schedule=60)
def notify_user(user_id):
    # lookup user by id and send them a message
    user = User.objects.get(pk=user_id)
    user.email_user('Here is a notification', 'You have been notified')

这将把notify_user转换为后台任务函数。当您从常规代码调用它时,它实际上会创建一个任务对象并将其存储在数据库中。然后,数据库包含关于哪个函数在以后实际需要运行的序列化信息。这确实限制了调用函数时可以传递的参数-它们都必须可序列化为JSON。因此,为什么在上面的示例中传递user_id而不是user对象。

正常调用notify_user将安排从现在开始60秒后运行原始函数:

notify_user(user.id)

这是默认的调度时间(如装饰器中设置的那样),但是可以被覆盖:

notify_user(user.id, schedule=90) # 90 seconds from now
notify_user(user.id, schedule=timedelta(minutes=20)) # 20 minutes from now
notify_user(user.id, schedule=timezone.now()) # at a specific time

此外,您现在可以在同步模式下运行原始函数:

notify_user.now(user.id)   # launch a notify_user function and wait for it
notify_user = notify_user.now   # revert task function back to normal function. 

对测试有用。您可以在计划任务时指定详细名称和创建者:

 notify_user(user.id, verbose_name="Notify user", creator=user)
施博文
2023-03-14

正如芹菜文档所解释的那样:

Celery通过消息进行通信,通常使用代理在客户机和工作人员之间进行调解。为了启动任务,客户机将消息添加到队列中,然后代理将消息传递给工作者。

您可以使用现有的MongoDB数据库作为代理。请参见使用MongoDB。

闾丘康安
2023-03-14

Celery 体系结构旨在跨多个服务器扩展和分配任务。对于像您这样的网站,这可能是一个过度的。通常需要队列服务来维护任务列表并发出已完成任务的状态信号。

你可能想看看休伊。Huey是一个小规模的芹菜“克隆”,只需要Redis作为外部依赖,而不需要RabbitMQ。它仍然使用Redis队列机制来排列队列中的任务。

还存在高级Python调度器,它甚至不需要Redis,但是可以在进程中在内存中保存队列的状态。

或者,如果您有非常少量的周期性任务,没有延迟的任务,我将只使用Cron和纯Python脚本来运行这些任务。

 类似资料:
  • 由于芹菜是作业队列/任务队列,因此名称说明了它可以维护其任务并处理它们。那么为什么它需要像rabbymq或redis这样的消息代理呢?

  • 我对ARM Cortex M4组件中的LDR和STR指令有疑问。出于某种原因,它们在内存中写入/读取某些部分比读取其他部分需要更长的时间。 为了说明这一点,我设置了一个简单的示例: 我已经创建了一个项目,它有一个主C文件和一个相邻的。包含汇编代码的文件。我已经使用“extern”对象将汇编函数包含到我的C文件中。 以下是该程序的作用: 它向我们展示了在“register_before_time=A

  • 在我的理想解决方案中,每个标签将在其可调用完成时变得可见,因此labelSecond应该在LabelFirst之后出现一段时间。它是我的Callable: 编辑:通过检查Future.isDone()和很少的更改,它可以像我希望的那样工作。

  • 我只想问关于争论的事。方法名并不重要,但每个方法都采用不同参数的唯一顺序,因此Oracle可以实现这个特性,而不是让每个“lambda-interface”都有一个方法。

  • 本文向大家介绍为什么我们需要一个数据库,包括了为什么我们需要一个数据库的使用技巧和注意事项,需要的朋友参考一下 数据库是数据的集合,通常以电子形式存储。数据库的设计通常是为了使其易于存储和访问信息。 好的数据库对任何公司或组织都至关重要。这是因为数据库存储了有关公司的所有相关详细信息,例如员工记录,交易记录,工资详细信息等。 数据库重要的各种原因是- 管理大量数据 数据库每天存储和管理大量数据。使

  • 问题内容: 我的问题就像标题说的那样:为什么我们需要9个补丁的图像?他们真的那么重要吗?其实,他们真正在做什么?我没有清楚地了解9色块图像的概念。 我知道9补丁图像是可伸缩的。因此,假设我有一些完全适合我的ldpi设备的图像按钮。使用Draw 9-patch工具(android SDK的一部分),我可以标记可缩放区域,并且该图像非常适合hdpi甚至xhdpi设备。边缘会很光滑。 但这真的是很好的实