草庐IT

GoRoutine

全部标签

multithreading - 在 goroutine 中执行 I/O 时,Go 会阻塞当前线程吗?

我对Go如何处理非阻塞I/O感到困惑。Go的API在我看来大多是同步的,在Go上观看演示文稿时,经常听到诸如“和调用block”之类的评论。从文件或网络读取时,Go是否使用阻塞I/O?或者在goroutine中使用时是否有某种魔法可以重写代码?来自C#背景,这感觉非常不直观,因为在C#中,我们在使用异步API时有await关键字,它清楚地表明API可以产生当前线程并稍后在一个继续。TLDR;在goroutine中执行I/O时,Go会阻塞当前线程吗?还是会使用continuation将其转换为类似C#的async/await状态机? 最佳答案

go - 如何创建一个从 goroutine 接收多个返回值的 channel

我在Go中有一个返回两个值的函数。我想将其作为goroutine运行,但我无法弄清楚创建接收两个值的channel的语法。有人能指出我正确的方向吗? 最佳答案 定义一个包含两个值的字段的自定义类型,然后创建该类型的chan。编辑:我还添加了一个使用多个channel而不是自定义类型的示例(位于底部)。我不确定哪个更惯用。例如:typeResultstruct{Field1stringField2int}然后ch:=make(chanResult)使用自定义类型(Playground)channel的示例:packagemainimp

multithreading - Go goroutine 是协程吗?

在GoogleI/O2012演示文稿中GoConcurrencyPatterns,RobPike提到多个goroutines可以存在于一个线程中。这是否意味着它们被实现为coroutines?如果没有,它们是如何实现的?欢迎提供源代码链接。 最佳答案 IMO,协程意味着支持explicit将控制权转移到另一个协程的方法。也就是说,程序员在决定一个协程何时应该暂停执行并将其控制权传递给另一个协程(通过调用它或通过返回/退出(通常称为屈服))时,以某种方式对协程进行编程。Go的“goroutines”是另一回事:它们隐式在gorouti

go - 最大 goroutine 数

我可以无痛使用多少个goroutine?例如维基百科说,在Erlang中可以创建2000万个进程而不会降低性能。更新:我刚刚investigatedingoroutinesperformance一点点,得到了这样的结果:看起来goroutine的生命周期超过了计算sqrt()1000次(对我来说约为45µs),唯一的限制是内存Goroutine需要4-4.5KB 最佳答案 如果一个goroutine被阻塞,除了:内存使用情况垃圾收集速度变慢成本(就内存和实际开始执行goroutine的平均时间而言)是:Go1.6.2(April20

go - 多个 goroutine 在一个 channel 上监听

我有多个goroutines试图同时在同一个channel上接收。似乎最后一个开始在channel上接收的goroutine获得了值。这是语言规范中的某个地方还是未定义的行为?c:=make(chanstring)fori:=0;i输出:goroutine4ExampleOnPlayground编辑:我刚刚意识到这比我想象的要复杂。消息在所有goroutine中传递。c:=make(chanstring)fori:=0;i输出:original,hifrom0,hifrom1,hifrom2,hifrom3,hifrom4注意:上述输出在最新版本的Go中已经过时(见评论)Example

go - 为什么 goroutine 中的 fmt.Println 不打印一行?

我有以下代码:packagemainimport"net"import"fmt"import"bufio"funcmain(){conn,_:=net.Dial("tcp","irc.freenode.net:6667")reader:=bufio.NewReader(conn)gofunc(){str,err:=reader.ReadString('\n')iferr!=nil{//handleitfmt.Println(err)}fmt.Println(str)}()}如果我没有从goroutine中的缓冲区读取的代码,它会输出这样的消息,这是我期望发生的::zelazny.fre

concurrency - Go并发和 channel 困惑

我是Go新手,在理解并发和channel方面存在问题。packagemainimport"fmt"funcdisplay(msgstring,cchanbool){fmt.Println("displayfirstmessage:",msg)c程序的输出是:displayfirstmessage:hello10000000000但我认为应该只有一行:displayfirstmessage:hello所以在main函数中,display和sum同时运行,sum需要更长的时间,所以display应该向c发送true并且程序应该在sum完成之前退出......我不确定我是否理解清楚。有人可以

concurrency - Go并发和 channel 困惑

我是Go新手,在理解并发和channel方面存在问题。packagemainimport"fmt"funcdisplay(msgstring,cchanbool){fmt.Println("displayfirstmessage:",msg)c程序的输出是:displayfirstmessage:hello10000000000但我认为应该只有一行:displayfirstmessage:hello所以在main函数中,display和sum同时运行,sum需要更长的时间,所以display应该向c发送true并且程序应该在sum完成之前退出......我不确定我是否理解清楚。有人可以

concurrency - Go 中惯用的可变大小工作池

我正在尝试在Go中实现一个worker池。go-wiki(以及Channels部分中的EffectiveGo)提供了边界资源使用的优秀示例。只需使用与工作池一样大的缓冲区创建一个channel。然后用worker填充该channel,并在完成后将它们发送回channel。从channel阻塞接收,直到有工作人员可用。所以channel和循环就是整个实现——非常酷!或者,可以阻止发送到channel,但同样的想法。我的问题是关于在运行时更改工作池的大小。我不相信有办法改变channel的大小。我有一些想法,但大多数似乎都太复杂了。Thispage实际上使用channel和空结构以几乎相同

concurrency - Go 中惯用的可变大小工作池

我正在尝试在Go中实现一个worker池。go-wiki(以及Channels部分中的EffectiveGo)提供了边界资源使用的优秀示例。只需使用与工作池一样大的缓冲区创建一个channel。然后用worker填充该channel,并在完成后将它们发送回channel。从channel阻塞接收,直到有工作人员可用。所以channel和循环就是整个实现——非常酷!或者,可以阻止发送到channel,但同样的想法。我的问题是关于在运行时更改工作池的大小。我不相信有办法改变channel的大小。我有一些想法,但大多数似乎都太复杂了。Thispage实际上使用channel和空结构以几乎相同