草庐IT

GoRoutine

全部标签

go - 如何在 Go 中执行并发下载

我们有一个流程,用户可以通过该流程请求我们需要从我们的来源获取的文件。此来源不是最可靠的,因此我们使用AmazonSQS实现了一个队列。我们将下载URL放入队列中,然后使用我们用Go编写的小应用程序对其进行轮询。这个应用程序只是检索消息,下载文件,然后将其推送到我们存储它的S3。一旦所有这些都完成,它会回调一个服务,该服务将通过电子邮件通知用户文件已准备就绪。最初我写这个是为了创建n个channel,然后为每个channel附加1个go-routine,并让go-routine处于无限循环中。这样我就可以确保我一次只处理固定数量的下载。我意识到这不是应该使用channel的方式,如果我

go - Go 程序的主 goroutine 和派生 goroutine 之间的区别

当使用gRPC创建服务器时,如果我在主进程中启动gRPC服务器,它可以处理来自客户端的请求(数千)。但是,如果我将服务器作为goroutine启动,它只能处理一些请求(数百个)并且在卡住之后。我已经通过一个非常简单的示例google.golang.org/grpc/examples/helloworld测试并确认了这一点。是否因为生成的goroutine堆栈大小非常小(2Kbytes),而主goroutine大得多?maingoroutine和spawnedgoroutine有什么区别?示例link.示例修改部分如下。greeter_server/main.gofuncmain(){g

go - Go 程序的主 goroutine 和派生 goroutine 之间的区别

当使用gRPC创建服务器时,如果我在主进程中启动gRPC服务器,它可以处理来自客户端的请求(数千)。但是,如果我将服务器作为goroutine启动,它只能处理一些请求(数百个)并且在卡住之后。我已经通过一个非常简单的示例google.golang.org/grpc/examples/helloworld测试并确认了这一点。是否因为生成的goroutine堆栈大小非常小(2Kbytes),而主goroutine大得多?maingoroutine和spawnedgoroutine有什么区别?示例link.示例修改部分如下。greeter_server/main.gofuncmain(){g

go - 如何停止协程

这个问题在这里已经有了答案:Howtostopagoroutine(8个答案)关闭5年前。我有一个调用函数的goroutine,我想用一个特殊参数启动或停止这个goroutine。我的问题是这段代码永远不会停止我的goroutine,它每次都会创建一个新工作。quit:=make(chanbool)run:=make(chanbool)gofunc(){for{select{case如何停止我的例行公事?

go - 如何停止协程

这个问题在这里已经有了答案:Howtostopagoroutine(8个答案)关闭5年前。我有一个调用函数的goroutine,我想用一个特殊参数启动或停止这个goroutine。我的问题是这段代码永远不会停止我的goroutine,它每次都会创建一个新工作。quit:=make(chanbool)run:=make(chanbool)gofunc(){for{select{case如何停止我的例行公事?

go - Go 中的死锁,两个例程拆分工作

我在go中遇到了一个死锁问题。这个程序接受一个整数数组a,并将它分成两部分。然后它将这两个部分放在两个不同的例程中并总结所有元素。在此之后,它应该将两个结果发送到channelres中。然后应将两个res(现在为ch)加在一起并打印。我的问题:我试图通过大量移动关闭函数来解决死锁问题,但似乎无济于事。显然,它只运行一个例程Add就可以很好地工作。packagemainimport("fmt")//Addaddsthenumbersinaandsendstheresultonres.funcAdd(a[]int,reschan 最佳答案

go - Go 中的死锁,两个例程拆分工作

我在go中遇到了一个死锁问题。这个程序接受一个整数数组a,并将它分成两部分。然后它将这两个部分放在两个不同的例程中并总结所有元素。在此之后,它应该将两个结果发送到channelres中。然后应将两个res(现在为ch)加在一起并打印。我的问题:我试图通过大量移动关闭函数来解决死锁问题,但似乎无济于事。显然,它只运行一个例程Add就可以很好地工作。packagemainimport("fmt")//Addaddsthenumbersinaandsendstheresultonres.funcAdd(a[]int,reschan 最佳答案

go - 锁定golang递归映射

我有一个类似递归映射的结构,如下所示:typeRecurseTablestruct{Tablemap[string]*RecurseTable//Otherfieldssync.RWMutex}如果我要从多个goroutine访问这个结构,我该如何锁定它呢?假设我正在从顶级map读取数据并写入第三级嵌套map。说这不会导致任何问题是否准确,因为更改第三层(并因此通过两个指针间接访问)不应该影响顶层map?类似地,如果我有一个goroutines池,所有修改信息都在第二级嵌套结构中,我是否只需要锁定每个第二级映射,因为顶级映射只包含指向的指针嵌套的递归表?还是我必须同时锁定顶级映射和嵌套

go - 锁定golang递归映射

我有一个类似递归映射的结构,如下所示:typeRecurseTablestruct{Tablemap[string]*RecurseTable//Otherfieldssync.RWMutex}如果我要从多个goroutine访问这个结构,我该如何锁定它呢?假设我正在从顶级map读取数据并写入第三级嵌套map。说这不会导致任何问题是否准确,因为更改第三层(并因此通过两个指针间接访问)不应该影响顶层map?类似地,如果我有一个goroutines池,所有修改信息都在第二级嵌套结构中,我是否只需要锁定每个第二级映射,因为顶级映射只包含指向的指针嵌套的递归表?还是我必须同时锁定顶级映射和嵌套

go - 如何识别一个goroutine?

假设我有一堆goroutines的堆栈跟踪,e。例如:goroutine5633[select]:net/http.(*persistConn).writeLoop(0xc21303ac00)/usr/lib/go/src/pkg/net/http/transport.go:791+0x271createdbynet/http.(*Transport).dialConn/usr/lib/go/src/pkg/net/http/transport.go:529+0x61e在我的例子中,一个独特的特定于应用程序的对象由一组goroutines提供服务,我想查看与特定对象相关的gorouti