Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python安排预订(非餐厅)_Python_Sqlalchemy_Scheduling_Bottle - Fatal编程技术网

使用python安排预订(非餐厅)

使用python安排预订(非餐厅),python,sqlalchemy,scheduling,bottle,Python,Sqlalchemy,Scheduling,Bottle,我正在编写一个python应用程序,它使用OpenStack为学生提供对有限数量虚拟机的访问 学生可以现在或将来进行预订 我需要将任何时候计划的虚拟机数量限制为X,同时如果插槽/预订可用,仍然允许学生预订虚拟机 保留对象如下所示(sqlalchemy)。我会知道申请预订的开始时间和时间长度,在这一点上,我需要检查现有的预订,看看在申请的时间段内是否有太多的预订。*_作业字段是APScheduler作业的名称 class Reservation(Entity): student = Man

我正在编写一个python应用程序,它使用OpenStack为学生提供对有限数量虚拟机的访问

学生可以现在或将来进行预订

我需要将任何时候计划的虚拟机数量限制为X,同时如果插槽/预订可用,仍然允许学生预订虚拟机

保留对象如下所示(sqlalchemy)。我会知道申请预订的开始时间和时间长度,在这一点上,我需要检查现有的预订,看看在申请的时间段内是否有太多的预订。*_作业字段是APScheduler作业的名称

class Reservation(Entity):
    student = ManyToOne('Student', required=True)
    class_id = ManyToOne('Class', required=True)
    image = ManyToOne('Image', required=True)
    # openstack image id filled in once the instance is started
    instance_id = Field(UnicodeText)

    # apscheduler jobs
    stop_instance_job = Field(UnicodeText)
    start_instance_job = Field(UnicodeText)
    warn_reservation_ending_job = Field(UnicodeText)
    check_instance_job = Field(UnicodeText)
有没有关于在哪里查找调度算法或类似示例的指针?我甚至不知道该找什么


谢谢。

您应该查找基于网格的调度器。通常,调度器不知道真正的执行时间(或资源使用时间),而复杂的启发式算法用于猜测问题将需要多长时间(请参阅位于以下位置的网格调度器上的此类启发式算法)。一种更简单的方法,使用一个基本的网格来表示一段时间内的工作负载,很可能满足您的需要。Python没有任何很棒的网格对象库,我知道(我以前在C++和Python中实现了一些,它们并不太难)。您应该看看numpy包,以更容易地解释多维对象——它可以很容易地模拟或实现网格

Msw提到了Dijkstra的银行家算法,这是作业调度的一种形式——但是你的问题更关心未来状态而不是当前状态,你可以准确地预测(知道)任务时间。因此,一个T(timesteps)乘以N(资源数量——可能只有1)乘以M(最大资源保留)的网格就足够了,您可以在注册作业时填写该网格。确定是否可以在特定时隙中调度特定作业是O(任务长度*M)检查网格的一个子部分(开始、停止)x(所需资源)x(1,M)是否为空插槽


为特定作业找到合适的位置(选择开始时间)是一项更为困难的任务,可以通过改进的Dijkstra算法或任何标准调度程序来实现(msw的评论比时隙功能检查更有帮助)。请注意,联机调度器的许多内容都是特定于操作系统进程调度的,它更关心操作类型(I/O与否)以及比抽象资源使用时间更长的惩罚。因此,谷歌搜索调度器通常会为您提供Linux调度器实现,而不是任意数据的技术。尝试查找最短的作业调度程序,它们通常更简单,在解释时不太依赖操作系统任务。

这让我印象深刻,因为Dijkstra的银行家算法的应用程序通常在作业调度中不太被讨论,因为它的先决条件(特别是执行时间)很难提前知道,但您已经知道了。一般的问题类别是“批量调度”。非常感谢。:)+1用于措辞恰当、简短但完整的问题。在一般情况下,这远不是最佳解决方案,但在不涉及任何优化的情况下(特别是当有人删除保留时)开始:搜索什么?-嗯,您需要搜索所有在
开始时间
结束时间
之间没有任何保留的
实例
。对不起,我所指的搜索内容是谷歌的日程安排。:)