当前位置: 首页 > 面试题库 >

Go select语句中的优先权变通办法

姬存
2023-03-14
问题内容

我希望在两个频道上进行go例程侦听,两个频道都排空时将其阻塞。但是,如果两个通道都包含数据,我希望先清空一个通道,再处理另一个通道。

在下面的工作示例中,我希望outexit处理所有内容之前先将其清空。我使用的select-statement没有任何优先顺序。我如何解决这个问题,使所有10个超值都在出口之前得到处理?

package main

import "fmt"

func sender(out chan int, exit chan bool){
    for i := 1; i <= 10; i++ {
        out <- i
    } 
    exit <- true
}

func main(){
    out := make(chan int, 10)
    exit := make(chan bool)

    go sender(out, exit)

    L:
    for {
        select {
            case i := <-out:
                fmt.Printf("Value: %d\n", i)
            case <-exit:
                fmt.Println("Exiting")
                break L
        }
    }
    fmt.Println("Did we get all 10? Most likely not")
}

问题答案:
package main

import "fmt"

func sender(out chan int, exit chan bool) {
    for i := 1; i <= 10; i++ {
        out <- i
    }
    exit <- true
}

func main() {
    out := make(chan int, 10)
    exit := make(chan bool)

    go sender(out, exit)

    for {
        select {
        case i := <-out:
            fmt.Printf("Value: %d\n", i)
            continue
        default:
        }
        select {
        case i := <-out:
            fmt.Printf("Value: %d\n", i)
            continue
        case <-exit:
            fmt.Println("Exiting")
        }
        break
    }
    fmt.Println("Did we get all 10? I think so!")
}

第一次选择的默认情况使其变为非阻塞。该选择将耗尽输出通道,而无需查看出口通道,否则将不等待。如果输出通道为空,则立即下降到第二选择。第二个选择是阻止。它将等待任一通道上的数据。如果有出口,它将对其进行处理并允许循环退出。如果有数据,它将返回循环的顶部并返回到耗尽模式。



 类似资料:
  • 问题内容: 我有以下代码: 此功能在专用的go例程中执行,并每秒发送一次心跳消息。取消上下文后,整个过程应立即停止。 现在考虑以下情形: 这将在关闭的上下文中启动心跳例程。在这种情况下,我不希望传输任何心跳。因此,应该立即输入选择中的第一个块。 但是,似乎无法保证对块进行评估的顺序,并且即使上下文已取消,该代码有时也会发送心跳消息。 实施这种行为的正确方法是什么? 我可以在第二个中添加“ isCo

  • 我试图限制用户使用我的桶策略访问我的桶。我有一组用户,他们都有一个S3FullAccess策略。我不能改变IAM中的任何东西。我只能使用我的遗愿保单。所以我想使用桶策略控制用户的访问。我把用户分成3类。 管理员访问我的桶(所有访问我的桶) 访问我的桶的权限有限的用户(如get-buk-策略,get-buk-位置) 无法访问我的桶。(无法访问我的桶) 下面的策略是我尝试过的,但不起作用。 我尝试了上

  • 我正在尝试建模一个使用静态资源的船舶队列,该资源是单个码头(使用流程图)。该队列有三种类型的代理A、B和C,它们分别具有优先级1、2和3(这意味着船C在队列中具有利用码头的优先级)。现在,我需要对以下两种与抢占相关的行为进行建模: 卸载船舶的任务(码头被扣押时的任务)必须在船舶C到达时抢占,但在船舶A或B到达时不抢占。这意味着“任务优先级”字段中定义的优先级对定义队列注意顺序有效,但对抢占无效。抢

  • 我的卡块有问题。现在,代理正在按照我设置的优先级访问资源。然而,如果有多个代理以相同的优先级到达,并请求相同的资源,那么Anylogic是否可能停止不知道向谁授予资源?

  • 我们不会在C编程语言中看到广度优先遍历(或广度优先搜索)的实现。 出于参考目的,我们将遵循我们的示例并将其作为我们的图形模型 - 用C实现 (Implementation in C) #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define MAX 5 struct Vertex { char label;

  • 我们不会在C编程语言中看到Depth First Traversal(或Depth First Search)的实现。 出于参考目的,我们将遵循我们的示例并将其作为我们的图形模型 - 用C实现 (Implementation in C) #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define MAX 5 struct