Python - 作业调度算法

问题描述 投票:0回答:1

我正在研究一个生成时间表的 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
,如果调度频率需要,我们允许超过间隔。

关于如何有效地做到这一点的任何提示?

python algorithm job-scheduling
1个回答
0
投票

你的调度程序知道你什么时候想安排工作。当您尝试安排它时,您会检查资源是否正在使用中。如果没有,执行。如果是,则将作业放入资源的优先级队列中。然后,当一个作业完成时,您可以重新安排它,如果资源已释放,则立即执行队列中的下一个作业。这会按照它们尝试可用的顺序执行需要资源的作业。

这适用于非共享资源。共享有点复杂。当你得到一个时,你在共享资源的非共享队列中添加一个条目,然后将共享资源添加到存储桶中。轮到共享条目时,您将启动所有可以共享的作业。并且在一段时间内将立即开始新的共享作业,只要它们不会花费太长时间(您必须决定“太长”,但不考虑这一点会导致资源匮乏)。然后你完成共享,并再次开始不共享,直到下一次共享时段出现。

© www.soinside.com 2019 - 2024. All rights reserved.