Python -作业调度算法

bvhaajcl  于 2023-04-19  发布在  Python
关注(0)|答案(1)|浏览(202)

我正在处理一个生成日程表的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的作业,如果需要调度频率,我们可以超过间隔。
有什么建议可以有效地做到这一点吗?

kyks70gy

kyks70gy1#

您的调度程序知道您何时要调度作业。当您尝试调度作业时,您会检查资源是否正在使用。如果没有,则执行。如果正在使用,则将作业放入资源的优先级队列中。然后,当作业完成时,您可以重新调度它,并且如果资源释放,则立即执行队列中的下一个作业。这将按照作业尝试可用的顺序执行需要资源的作业。
这适用于非共享资源。共享资源稍微复杂一点。当你得到一个共享资源时,你在非共享队列中添加一个条目,然后将共享资源添加到一个桶中。当共享条目轮到它时,你启动所有可以共享的作业。在一段时间内,将立即启动新的共享作业,只要它们不会花费太长时间(你必须决定“太长”,但不考虑这一点会导致资源饥饿)。然后你完成共享,并开始再次做非共享,直到下一次你有一个共享周期来了。

相关问题