我正在处理一个生成日程表的python类,我创建了一个我心目中的类的模型,以及创建与它接口的对象的示例。
class JobScheduler(object):
def __init__(self, start_time: int, stop_time: int):
self.start_time
self.stop_time
def add_job(self, job_type, job_config, interval, duration, resource, prevent_resource_overlap=True):
pass
def generate_schedule(self):
pass
job_scheduler = JobScheduler(start_time=0, stop_time=3600)
job_scheduler.add_job(
job_type='CLEAN_ROOM',
job_config={'args': 'xyz'},
interval=32,
duration=30,
resource='VACUUM')
job_scheduler.add_job(
job_type='CLEAN_KITCHEN',
job_config={'args': 'xyz'},
interval=300,
duration=30,
resource='VACUUM')
job_scheduler.add_job(
job_type='CLEAN_ROOM',
job_config={'args': 'xyz'},
interval=300,
duration=30,
resource='MOP')
job_scheduler.add_job(
job_type='CLEAN_ROOM',
job_config={'args': 'xyz'},
interval=100,
duration=30,
resource='VACUUM',
prevent_resource_overlap=False)
job_scheduler.generate_schedule()
[
{
"job_type": "CLEAN_ROOM",
"job_config": {'args': 'xyz'},
"start_time": 0,
"duration": 30,
"resource": "VACUUM"
},
{
"job_type": "CLEAN_ROOM",
"job_config": {'args': 'xyz'},
"start_time": 0,
"duration": 30,
"resource": "MOP"
},
{
"job_type": "CLEAN_ROOM",
"job_config": {'args': 'xyz'},
"start_time": 0,
"duration": 30,
"resource": "VACUUM"
},
{
"job_type": "CLEAN_KITCHEN",
"job_config": {'args': 'xyz'},
"start_time": 32,
"duration": 30,
"resource": "VACUUM"
},
...
...
...
]
棘手的部分是调度应该防止使用相同resource
的其他作业重叠,除非prevent_resource_overlap=False
。我们还需要循环这些重叠的资源,以便最终调度它们。对于prevent_resource_overlap=True
的作业,如果需要调度频率,我们可以超过间隔。
有什么建议可以有效地做到这一点吗?
1条答案
按热度按时间kyks70gy1#
您的调度程序知道您何时要调度作业。当您尝试调度作业时,您会检查资源是否正在使用。如果没有,则执行。如果正在使用,则将作业放入资源的优先级队列中。然后,当作业完成时,您可以重新调度它,并且如果资源释放,则立即执行队列中的下一个作业。这将按照作业尝试可用的顺序执行需要资源的作业。
这适用于非共享资源。共享资源稍微复杂一点。当你得到一个共享资源时,你在非共享队列中添加一个条目,然后将共享资源添加到一个桶中。当共享条目轮到它时,你启动所有可以共享的作业。在一段时间内,将立即启动新的共享作业,只要它们不会花费太长时间(你必须决定“太长”,但不考虑这一点会导致资源饥饿)。然后你完成共享,并开始再次做非共享,直到下一次你有一个共享周期来了。