当前位置: 首页 > 知识库问答 >
问题:

goroutine,它接受信道接收器并将字符串发送到信道

潘雅珺
2023-03-14

我试图对goroutines做一个循环,它接受一个接收字符串的通道,每次接收它时,它都应该将值追加到另一个字符串。只有在所有goroutine结束时(goroutine计数应该是传入的列表的长度),代码才应该继续。

func appendToStr(str string, list []string, origin *url.URL) {
    var currProc int32 = 0;
    var maxProc int32 = int32(len(list))

    var strReceiver := make(chan string, len(list))
    for _, item := range list {
        go func() {
            doAsyncAndIncrement(item, strReceiver, &currProc)
            str += <-strReceiver 
        }()
    }

    for {
        if atomic.LoadInt32(&currProc) <= maxProc {
            break;
        }
    }

    // continue on using 'str' which now contains the append values from the 'strReceiver' channel
}

func doAsyncAndIncrement(item string, receiver chan<- string, count *int32) {
    defer atomic.AddInt32(count, 1)

    var val string
    // do something with 'item' and set 'val'...

    receiver <- val
}

共有1个答案

曹振
2023-03-14

代码的一个问题是go例程调用周围的闭包太大。

for _, item := range list {
    go func() {
        doAsyncAndIncrement(item, strReceiver, &currProc)
        str += <-strReceiver 
    }()
}

item的作用域为for循环,而不是goroutine中的匿名函数,因此当您触发N个goroutine时,item变量同时在for循环中更新。要解决这个问题,请将该变量显式地传递给goroutine,以避免使用闭包:

for _, item := range list {
    go func(item string) {
        doAsyncAndIncrement(item, strReceiver, &currProc)
        str += <-strReceiver 
    }(item)
}
 类似资料:
  • 我正在尝试设置一个类来接收短信和发送状态。以下是我的清单如何查找此任务: 我收到了收到的消息,但没有收到发送的消息,我的清单声明有问题吗?

  • 我对邮件服务器和邮件帐户有疑问。 我想知道是否可以向邮件服务器询问邮件帐户在其收件箱中发送或接收的邮件数。 我不知道这是否可以通过pop3/imap/smtp协议或特定的邮件服务器api实现。 可能通过连接到邮件服务器并使用邮件帐户凭据登录,可以通过邮件服务器api或协议获取此信息。 任何想法?

  • 本文向大家介绍Android接收和发送短信处理,包括了Android接收和发送短信处理的使用技巧和注意事项,需要的朋友参考一下 关于短信接收处理方面,当前已经有一些app做的比较好了,比如发给手机发验证码验证的问题,很多app在手机接收到验证码后,不需要输入,就直接可以跳过验证界面,这就是用到了对接收到的短信的处理。至于短信的发送,也没什么好说的了。在此也只是附上一个小实例。 效果图: MainA

  • 问题内容: 假设我的C程序处理SIGUSR1。当它接收到信号时,是否可以知道是谁发送的?即 得到那个过程的pid? 问题答案: 是的,如果您使用调用而不是来设置信号处理程序。这样做可以让您设置一个带有三个参数的信号处理程序: An ,代表信号编号(就像) A 是一种结构,其中包含有关信号源的各种信息,包括发送方的pid(如果适用)。(其中还包括有关自动信号之类的信号原因的信息。) A ,与哪个线程

  • 我希望我的Java应用程序在不使用任何额外硬件设备的情况下发送和接收短信,而且它必须是免费的。 我进行了搜索,但我只找到了标题,我找到了一些类似SMSLib的东西,但另一方面,我没有找到学习这些的教程或书籍。 我还发现了SMSLib代码,但不明白: 发送消息/短信代码 阅读信息/短信代码

  • 监控系统产生报警事件之后需要发送报警邮件或者报警短信,各个公司可能有自己的邮件服务器,有自己的邮件发送方法;有自己的短信通道,有自己的短信发送方法。falcon为了适配各个公司,在接入方案上做了一个规范,需要各公司提供http的短信和邮件发送接口。 短信发送http接口: method: post params: - content: 短信内容 - tos: 使用逗号分隔的多个手机号 邮