【问题标题】:What pattern to use for a queue of actions?用于操作队列的模式是什么?
【发布时间】:2020-08-10 16:52:11
【问题描述】:

我正在编写一个“机器人”,它将有一个预定义动作列表,并且在处理每个动作时,动作代码将能够将更多动作添加到队列中,作为接下来要处理的事情(不在结束)。

假设我将从动作 A、B 和 C 开始队列,在处理 B 时,它会在 C 之前添加需要处理的 B1 和 B2。将已处理动作的最终顺序保留为 A B B1 B2 C。

普通的 FIFO 队列不会削减它,因为项目只能添加到队列的末尾。

我相信,普通的 LIFO 堆栈也不行。

你会在这个场景中使用什么?

【问题讨论】:

    标签: ruby parallel-processing queue


    【解决方案1】:

    您可以使用数组,只需将任务添加到前面 (unshift) 并从前面获取任务 (shift)

    queue = ["A", "B", "C"]
    
    def process_next_step(queue)
      puts "Tasks are #{queue}"
      task = queue.shift
      puts "Current task is #{task}"
    
      if task == "B"
        puts "adding subtasks"
        queue.unshift("B1")
        queue.unshift("B2")
      else
        puts "Doing #{task}"
      end
    end
    
    while !queue.empty?
      process_next_step(queue)
    end
    

    这会产生

    Tasks are ["A", "B", "C"]
    Current task is A
    Doing A
    Tasks are ["B", "C"]
    Current task is B
    adding subtasks
    Tasks are ["B2", "B1", "C"]
    Current task is B2
    Doing B2
    Tasks are ["B1", "C"]
    Current task is B1
    Doing B1
    Tasks are ["C"]
    Current task is C
    Doing C
    

    【讨论】:

      【解决方案2】:

      我会使用某种树。

      首先它进入A。如果A没有移动到B,则检查A是否有任何叶子。 在 B 它做 B 然后检查是否有任何叶子。查找 B1 和 B2。做 B1 并检查 B1 是否有叶子。没有找到叶子。做B2。检查 B2 是否有叶子。没有找到。 有没有C

      您可以随时将进程添加为叶子,并且应该适用于您的机器人

      您还可以使用链表,其中每个进程都是一个节点并指向下一个进程。可以轻松地将 B1 添加为下一个进程,将 B2 作为下一个进程,然后将 C 作为 B2 的下一个进程。

      【讨论】:

        猜你喜欢
        • 2011-06-02
        • 1970-01-01
        • 2014-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多