【问题标题】:Preventing multiple executions防止多次执行
【发布时间】:2013-03-11 18:26:30
【问题描述】:

我有这个 Django cron 作业脚本(我为此使用了 kronos,这很棒)。

由于我每分钟都会触发此作业,因此我想确保没有另一个脚本实例已经在运行。如果有之前的作业正在运行,那么我想跳过当前的执行。

我知道我可以使用锁定文件来做到这一点,但这不是很可靠,并且当您在执行过程中重新启动时可能会导致问题(您必须清除锁定文件)等。

使用 Python(在本例中为 Django)执行此操作的最佳方法是什么?

编辑:我的目标是 Linux,很抱歉漏掉了这个。

【问题讨论】:

  • 在什么平台上?如今,锁定文件在大多数 Unix/Linux 平台上都非常可靠:将 os.open 与 O_CREAT|O_EXCL 一起使用,以保证只有单个进程可以访问该文件以及对应于基于内存或交换的文件系统的路径(如 tmpfs : /tmp 在 Solaris 上,/run 或 /var/run 在 Linux 上)解决了您的重启问题。唯一的潜在问题是如果您的进程崩溃、未清理等...
  • 另一种选择是使用基于内核的信号量。
  • 对不起,Linux :-)
  • 我也很想知道这个:)

标签: python django locking cron-task


【解决方案1】:

这里有一个 Django 应用程序:https://github.com/jsocol/django-cronjobs

也可以在 pip 上使用 cronjobs

以防万一你直接去点子;您可以像这样使用装饰器注册作业:

# myapp/cron.py
import cronjobs

@cronjobs.register
def periodic_task():
    pass

然后通过以下方式运行命令:

$ ./manage.py cron periodic_task

它默认具有作业锁定,但您可以在应用装饰器时禁用它:

@register(lock=False)

【讨论】:

    猜你喜欢
    • 2018-02-13
    • 2010-09-30
    • 2012-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多