gpt4 book ai didi

language-agnostic - 设计模式 : managing a limited number of a resource

转载 作者:行者123 更新时间:2023-12-05 00:08:23 25 4
gpt4 key购买 nike

我正在为一个系统设计一个特性,我强烈地觉得那里必须有一个模式,在深入研究代码之前我应该​​知道这一点。

场景是这样的:

  • 我有一个资源池,但数量有限。
  • 我有不同数量的消费者使用这些资源;每个消费者只需要一种资源,并且在给定时间它可能不会与任何其他消费者使用相同的资源。
  • 消费者被分成固定数量的组,系统需要保证每个组至少有一个资源。
  • 每个组的消费者数量随时间而变化;它们根据需要进行分配和解除分配。

  • 我目前的方法是在启动时将资源放入两个堆栈:一个“紧急堆栈”和一个“公共(public)堆栈”。紧急堆栈将包含与组相同数量的资源(因此,每个组一个)。其余可用资源进入公共(public)堆栈。

    当一个新的消费者即将被创建时,系统会请求一个资源。如果公共(public)堆栈中有可用的资源,则会从其中弹出一个并返回给调用者。如果公共(public)堆栈为空,则可以从紧急堆栈中弹出资源,但前提是同一组中没有消费者已经拥有紧急资源。

    每当一个组内的消费者可以被释放时,相关的资源将被返回,并被推送到一个资源堆栈中。负责释放消费者的代码将确保总是首先返回任何紧急资源,以便在返回的资源被推送到公共(public)堆栈之前填充紧急堆栈。

    我觉得这种问题应该存在一种经过测试并证明可以很好地工作的设计模式,所以我向社区呼吁:你知道这样的模式吗?如果是这样,我恳请您赐教。

    更新

    该解决方案现在已实现,使用来自该问题的各种答案的点点滴滴。我发表了 a blog post关于它。

    最佳答案

    我可能有一个资源堆栈,一个由计数组键控的数组/映射,以及一个没有资源的组计数。

    分配...

    if group-counts [group] == 0
    pop resource from stack
    increment group-counts [group]
    decrement reserved-count

    elseif reserved-count < stack.size
    pop resource from stack
    increment group-counts [group]

    else
    fail

    关键是堆栈永远不允许小于仍然有权要求立即资源的组的数量。

    这种方法的一个优点是,如果需要,您可以使其更加灵活。假设一组有特殊需求,因此它可能随时需要两种资源。
    if group-counts [group] < group-reserved [group]
    pop resource from stack
    increment group-counts [group]
    decrement reserved-count

    elseif reserved-count < stack.size
    pop resource from stack
    increment group-counts [group]

    else
    fail

    在这种情况下,reserved-count 以所有 group-reserved[] 值的总和开始。

    本案的发布逻辑是……
    push resource to stack
    decrement group-counts [group]
    if group-counts [group] < group-reserved [group]
    increment reserved-count

    对于简单的情况,使用“if group-counts [group] == 0”。

    关于language-agnostic - 设计模式 : managing a limited number of a resource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1496576/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com