小编Roo*_*osh的帖子

限制运行的go例程

我有要处理的网址列表,但我想一次运行最大数量的goroutine。例如,如果我有30个网址,那么我只希望10个goroutine并行工作。

我对此的尝试如下:

parallel := flag.Int("parallel", 10, "max parallel requests allowed")
flag.Parse()
urls := flag.Args()

var wg sync.WaitGroup
client := rest.Client{}

results := make(chan string, *parallel)

for _, url := range urls {
    wg.Add(1)
    go worker(url, client, results, &wg)
}

for res := range results {
    fmt.Println(res)
}

wg.Wait()
close(results)
Run Code Online (Sandbox Code Playgroud)

我的理解是,如果我创建一个大小为并行的缓冲通道,那么该代码将阻塞,直到我读出结果通道为止,这将取消阻塞我的代码并允许生成另一个goroutine。但是,此代码似乎在处理完所有网址后不会阻塞。有人可以向我解释如何使用通道限制运行的goroutine的数量吗?

go goroutine

5
推荐指数
1
解决办法
316
查看次数

如何使用grep查找仅包含小写的行

我是bash的新手,我正在学习使用grep.

grep ^[a-z] file.txt将以小写显示以小写字母开头的
grep [a-z] file.txt所有行

无法弄清楚如何用ALL小写显示行,任何人都可以帮忙吗?

regex bash grep

4
推荐指数
1
解决办法
8326
查看次数

从非缓冲通道读取

我试图理解非缓冲通道,所以我编写了一个小应用程序,它遍历用户输入的数组,做一些工作,将信息放在非缓冲通道上,然后读取它。但是,我无法从频道中读取信息。这是我的代码

toProcess := os.Args[1:]

var wg sync.WaitGroup
results := make(chan string)
errs := make(chan error)

for _, t := range toProcess {
    wg.Add(1)
    go Worker(t, "text", results, errs, &wg)
}


go func() {
    for err := range errs {
        if err != nil {
            fmt.Println(err)
        }
    }
}()


go func() {
    for res := range results {
        fmt.Println(res)
    }
}()
Run Code Online (Sandbox Code Playgroud)

我对非缓冲通道有什么不了解?我想我应该在上面放置信息,并从中读取另一个常规内容。

编辑:使用两个 goroutines 解决了问题,但是当出现错误时它仍然给我以下信息:

open /Users/roosingh/go/src/github.com/nonbuff/files/22.txt: no such file or directory
fatal error: all goroutines are asleep - deadlock!

goroutine …
Run Code Online (Sandbox Code Playgroud)

concurrency go goroutine

1
推荐指数
1
解决办法
796
查看次数

标签 统计

go ×2

goroutine ×2

bash ×1

concurrency ×1

grep ×1

regex ×1