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

如何有效关闭渠道?

南门飞扬
2023-03-14
问题内容

我正在尝试做一些事情:

type Feed struct {
    title, descr, link string
    published          time.Time
}
func main() {
    ar := make([]Feed, 0)
    for i := 0; i < 3; i++ {
        f: = new(Feed)
        // do some stuff with feed
        ar = append(ar, *f)
    }

    ch := make(chan Feed, 3)

    for _, i := range ar {
        go process(i, ch)
    }

    r :=0
    for i := range ch {
        fmt.Println(i)
        r++
        if r == 3 {
            close(ch)
        }
    }
}
func process(i Feed, ch chan Feed) {
 // do some stuff
 ch <- i
}

似乎ar没有必要,但是如果将其删除,则最后一个范围将永远存在。我做错了什么?

另一个问题是-使用Go例程的这种方式正确吗?


问题答案:

这是生产者-
消费者类型的示例。我只使用WaitGrouphere,这样主goroutine不会立即退出。从理论上讲,您的应用程序可以等待,或者在此期间做一些其他有趣的事情。

请注意,您还可以使用c := make(chan(*Feed, n))其中n要缓冲编号的缓冲通道。请注意,在典型的生产者-
消费者方案中,有时每个作业分配了很多资源。因此,根据需要,您可以仅缓冲其中的一些缓冲,也可以全部缓冲。

如果没有缓冲通道,它将充当goroutine之间的同步。生产者在c <-等待消费者<- c交接时阻塞,因此每个例程中只有一个例程一次执行这些行。

编辑 我在打印“开始”之前添加了一个暂停,以使输出不太同步。以前总是输出:

created
started
created
started
...

https://play.golang.org/p/FmWqegr-CR

package main

import (
    "fmt"
    "math/rand"
    "sync"
    "time"
)

type Feed struct {
    title, descr, link string
    published          time.Time
}

func CreateFeed() *Feed {
    r := rand.Int() % 500
    time.Sleep(1000 + time.Duration(r)*time.Millisecond)
    fmt.Println("Feed created")
    return &Feed{
        published: time.Now(),
    }
}

func UseFeed(f *Feed) {
    time.Sleep(100 * time.Millisecond)
    fmt.Println("Feed started")
    time.Sleep(1600 * time.Millisecond)
    fmt.Printf("Feed consumed: %s\n", f.published)
}

func main() {
    numFeeds := 10

    var wg sync.WaitGroup
    wg.Add(10)

    c := make(chan (*Feed))
    for i := 0; i < numFeeds; i++ {
        go func() { c <- CreateFeed() }()
    }

    for i := 0; i < numFeeds; i++ {
        go func() {
            f := <-c
            UseFeed(f)
            wg.Done()
        }()
    }

    wg.Wait()
}

我希望这是您想要的。



 类似资料:
  • < b >想改进这个问题?通过编辑此帖子更新问题,使其只关注一个问题。 我正在开发一个原生android应用程序,没有错误,但Logcat说 android-Studio指向的警告线:- 当您的应用程序无法与 LAN 上的本地服务器通信时,会出现此问题。 有人能建议我如何有效地处理这种例外情况吗?只是希望我的应用程序没有错误和警告。 也许我们可以使用<code>try-catch</code>?至

  • 问题内容: 我找不到有关如何关闭hbm2ddl的参考。 问题答案: 只是忽略默认设置,使Hibernate不执行任何操作。从参考文档中: 1.1.4。hibernate配置 该选项打开直接在数据库中自动生成数据库模式的功能。 也可以通过删除配置选项将其关闭 ,或在SchemaExport Ant任务的帮助下将其重定向到文件。 设置为(未记录)可能会生成警告,例如:

  • 我有这个密码... 有人知道为什么它不停吗? 我也尝试了下面的一个新的主要方法,但它一直在运行。 public static void main(string[]args){ApplicationContext context=new ClassPathXmlApplicationContext(“ApplicationContext.xml”);((ConfigurableApplication

  • 我正在使用sql server jdbc驱动程序mssql-jdbc-9.2.1.jre8-sources.jar并创建的对象。 在用host-credential-etc进行设置后,打开连接和关闭连接,如何关闭SQLServerDataSource对象本身,在api中找不到任何方法。 https://javadoc.io/doc/com.microsoft.sqlserver/mssql-jdb

  • 我们有一个按日期对数据进行分区的系统。 例如,在SqlServer中,每个月有一个数据库的数据。每个月分区使用包装在C3P0连接池中的Jdbc驱动程序数据源。 经过一段时间后,分区的日期范围变得足够老,我们想要离线它。在这种情况下,我们只需从可用列表中删除相关月份的。 但是,理想情况下,当脱机时,我希望“关闭”以便池放弃到DB的所有连接。 没有可供我调用的close方法,因此我不确定如何清理该方法

  • 问题内容: 每当我们从数据库或类似来源获取一些用户输入的内容并进行一些编辑时,我们都可能会检索仅包含开始标记但没有结束标记的部分。 这可能会妨碍网站的当前布局。 有客户端或服务器端的方法可以解决此问题吗? 问题答案: 找到了一个很好的答案: 使用PHP 5并使用DOMDocument对象的loadHTML()方法。此自动解析格式错误的HTML,随后对saveXML()的调用将输出有效的HTML。D