【问题标题】:Monitor Management Command Execution in Django监控 Django 中的管理命令执行
【发布时间】:2015-01-14 00:11:37
【问题描述】:

我正在编写一个 Django 应用程序,它使用管理命令从各种来源提取数据。计划是使用 cron 每小时运行一次此命令,并让它在视图中的用户命令上运行(即,当他们添加需要数据的新项目时,我不希望他们等待下一个小时滚动到见结果)。问题是:

我怎样才能设置这个命令,如果它已经在运行,它就不会执行?是否有一些地方可以存储一个可以在执行前由脚本检查的变量?我目前最好的想法是让命令监控 stdout 一段时间,以确保没有其他内容正在执行,但这似乎充其量只是一个 hack。这是唯一将在后台运行的任务。

我基本上是尽量避免在这里使用 Celery。

【问题讨论】:

  • 不要为芹菜出汗。它易于设置且易于运行。如果 RabbitMQ 让您头疼,我将 Redis 用作 MQ,并且问题很少。

标签: python django


【解决方案1】:

将您的读取函数包装在一个 try/except 块中,标记一些外部记忆以进行执行控制。我以 Redis 为例:

from redis import Redis

try:
    r_client = Redis() # assuming standard settings
    sentinel = r_client.incr("my_sentinel")
    if sentinel == 1:
        run_command()
    else:
        r_client.decr("my_sentinel")
except Exception as e:
    r_client.decr("my_sentinel")
    raise e

【讨论】:

  • 我希望避免添加另一个数据存储。根据this question,原子操作在 Django 中是可行的。是否考虑使用它?
  • 是的,您可以这样做,但需要往返数据库。您也可以使用文件系统执行此操作,将值存储在filelock 中。你也可以使用memcached(几乎所有的代码都是一样的)。
【解决方案2】:

您可以在管理命令的开头创建一个名为“i_am_running.log”的文件,并在最后删除它。当运行相同的管理命令时,检查它的存在。如果不存在 - 走得更远。否则 - 中止。

【讨论】:

  • 如果只有一个正在运行的实例至关重要,这太简单了。它太容易受到竞争条件的影响。你需要一些原子的东西来确保单个运行实例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-09
  • 1970-01-01
  • 2018-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多