0

我正在用 Python 编写一个带有 Django 前端的备份系统。我决定以一种有点奇怪的方式实现调度——客户端将轮询服务器(每 10 分钟左右),以获取需要执行的备份列表。服务器仅在达到备份时间时才会响应。这是为了保持系统平台独立 - 这样我就不会依赖 cronjobs 或类似的东西。因此,Django 前端(它公开了一个 XML-RPC API)必须将调度存储在数据库中,并解释该调度以决定客户端是否应该开始备份。

目前,时间表使用 3 个字段存储:天、小时和分钟。这些是以逗号分隔的整数列表,表示一周中的天数 (0-6)、一天中的小时数 (0-23) 和一小时中的分钟数 (0-59)。要决定客户端是否应该开始备份是一个非常低效的操作——Python 必须循环从过去 7 天开始的所有天,然后是小时,然后是分钟。我已经做了一些优化以确保它不会循环太多 - 但仍然如此!

这工作相对较好,虽然实现相当丑陋。我遇到的问题是如何通过前端的 HTML 表单显示和解释这些信息。目前我只有大量的多选字段列表,这显然效果不佳。

任何人都可以建议一种不同的方法来实现更有效且更容易以 HTML 表单表示的时间表吗?

4

2 回答 2

3

看看django-chronograph。它有一个非常漂亮的界面,可以按各种时间间隔安排作业。你也许可以从中借鉴一些想法。它依赖于python-dateutil,您可能还会发现它对于指定重复事件很有用。

于 2009-03-06T17:39:35.167 回答
1

你的问题有点模棱两可——你的意思是:“在每个星期日、星期一和星期五的时间 X 备份。” ?

如果是这样,请使用位掩码将重复计划存储为整数:

假设您希望在周日、周一和周五进行上述备份。将星期几编码为整数(以二进制表示):

S M T W T F S
1 1 0 0 0 1 0 = 98

要确定今天(例如星期五)是否是备份日,只需按位执行and

>>> 0b1100010 & 0b0000010 != 0
True

要将当前日期作为整数获取,您需要将其偏移一,因为weekday()假设一周从星期一开始:

current_day = (timezone.now().weekday() + 1) % 7

总之,您的Schedule对象的架构将类似于:

class Schedule(models.Model):
    days_recurrence = models.PositiveSmallIntegerField(db_index=True)
    time = models.TimeField()

使用此模式,您需要Schedule在一天中的每个时间都需要一个新对象来备份。这是一个快速查找,因为按位运算大约需要 2 个周期,并且由于您正在索引 field days_recurrence,因此您有一个最坏情况的日查找,O(logn)它应该会大大降低您的复杂性。如果您想从中获得更多性能,您还可以使用一个小时的位掩码,然后存储分钟。

于 2016-05-17T14:59:39.027 回答