【发布时间】:2014-11-10 22:59:36
【问题描述】:
我有一个日期时间间隔列表(开始时间和结束时间)。日期时间间隔有一些额外的属性(见 schedule)。 由于排序,我已经有了间隔的上升时间表。 现在我想实现一些方法来处理重叠冲突。 每次应该只运行一个任务。重叠的任务应该被跳过而不是被转移或延迟。
这些调度方法应该是这样的
- FCFS(先到先得):应该明确
- 优先级等属性的最大值
- 事件的最长持续时间(应该类似于最大值)
所以假设我们有像 Event(Interval, priority): A(0-7, 2), B(5-10, 3), C(8-15,1), D(20-25,0) 这样的事件)。 更高的价值,更高的优先级。
FCFS:A、C、D - 最高优先级:B、D - 最长持续时间:A、C、D
这是我第一次使用 FCFS。我认为这是一种不好的方法 - 对于其他方法也是如此,因为我需要一种反向查找,而不仅仅是最后一个事件。
样本数据:
start1 = datetime.now()
start2 = datetime.now() + timedelta(seconds=40)
start3 = datetime.now() + timedelta(seconds=70)
start4 = datetime.now() + timedelta(seconds=200)
schedule = [{"start": start1,
"end": start1 + timedelta(seconds=60),
"name": "Task1",
"attr": 2},
{"start": start2,
"end": start2 + timedelta(seconds=60),
"name": "Task2",
"attr": 3},
{"start": start3,
"end": start3 + timedelta(seconds=60),
"name": "Task3",
"attr": 1},
{"start": start4,
"end": start4 + timedelta(seconds=60),
"name": "Task4",
"attr": 0}
]
助手调用 DateTimeInterval。对于差异我使用了this。
class DateTimeInterval(object):
def __init__(self, start, end):
self.start = start
self.end = end
def __sub__(self, other):
latest_start = max(self.start, other.start)
earliest_end = min(self.end, other.end)
return earliest_end - latest_start
FCFS 调度
# now we can order the beginnings
schedule_sorted = sorted(schedule, key=lambda x: (x["start"], x["name"]))
last = None
for job in schedule_sorted:
interval = DateTimeInterval(job["start"], job["end"])
# if there is a last entry
if last:
interval_last = DateTimeInterval(last["start"], last["end"])
diff = interval - interval_last
if diff.total_seconds() > 0:
logging.warn("%s CONFLICT OVERLAPPING %s!", job["name"], diff)
else:
last = job
else:
last = job
logging.info("%s: %s %s", job["name"], job["start"], job["end"])
我可能会破解所有方法,从而产生一些丑陋的代码。
有没有人(处理过实现这种不同的调度要求并且)知道一个很好的方法来做到这一点?
【问题讨论】:
-
对于 FCFS,键(例如 datetime(start1))是否应该是第一个最旧的? attr 值是整数吗?时长是通过 schedule[key]["end"] 和 schedule[key]["start"] 的差来计算的吗?
-
是的,FCFS 首次启动将获胜。 Attr 很可能是一个整数。持续时间由差值计算。并且计算重叠是在 DateTimeInterval 的
__sub__方法中实现的,例如 this。 -
我建议你开始研究 python 的 min 和 max 函数。使用让您通过自定义函数决定排序标准的关键参数。您可以在该客户功能中根据需要比较字典元素。在此处查看示例stackoverflow.com/questions/26833373/…
-
还在调度字典中添加一些实际值以及每种情况下的预期输出。这将有助于解决问题并提供解决方案。
-
@user3885927 做到了。稍微简化一下并纠正我在编辑此帖子时所做的一些错误。我不知道这是否清楚。只有一个资源和一个作业可以一次运行。
标签: python datetime scheduling intervals