我正在研究一个生成时间表的 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
。我们还需要循环这些重叠的资源,以便它们最终得到调度。对于 job 的 where prevent_resource_overlap=True
,如果调度频率需要,我们允许超过间隔。
关于如何有效地做到这一点的任何提示?
你的调度程序知道你什么时候想安排工作。当您尝试安排它时,您会检查资源是否正在使用中。如果没有,执行。如果是,则将作业放入资源的优先级队列中。然后,当一个作业完成时,您可以重新安排它,如果资源已释放,则立即执行队列中的下一个作业。这会按照它们尝试可用的顺序执行需要资源的作业。
这适用于非共享资源。共享有点复杂。当你得到一个时,你在共享资源的非共享队列中添加一个条目,然后将共享资源添加到存储桶中。轮到共享条目时,您将启动所有可以共享的作业。并且在一段时间内将立即开始新的共享作业,只要它们不会花费太长时间(您必须决定“太长”,但不考虑这一点会导致资源匮乏)。然后你完成共享,并再次开始不共享,直到下一次共享时段出现。