我可以使用多less个肠衣? 例如维基百科说,在Erlang中,可以创build2000万个进程而不会降低性能。 更新:我刚刚在goroutines性能上调查了一下,得到了这样的结果: 看起来goroutine的寿命更多的是计算sqrt()1000次(〜45μs),唯一的限制就是内存 Goroutine花费4 – 4.5 KB
其他例程在调用系统调用时如何继续执行? (使用GOMAXPROCS = 1时) 据我所知,当调用系统调用时,线程放弃控制,直到系统调用返回。 如何在不通过阻塞系统调用goroutine创build系统线程的情况下实现这种并发性? 从文档 : 够程 它们被称为goroutines,因为现有的术语(线程,协程,进程等等)传递的是不准确的内涵。 goroutine有一个简单的模型:它是一个在同一个地址空间中与其他goroutines同时执行的函数。 它是轻量级的,比堆栈空间的分配花费更多。 堆栈起点很小,所以它们很便宜,而且根据需要分配(并释放)堆存储空间以增加堆栈。 Goroutines被多路复用到多个OS线程,所以如果应该阻塞,比如在等待I / O的时候,其他的继续运行。 他们的devise隐藏了许multithreading创build和pipe理的复杂性。
sync.WaitGroup这个示例用法sync.WaitGroup正确? 它给出了预期的结果,但我不确定wg.Add(4)和wg.Done()的位置。 wg.Add()一次添加四个goroutines是否有意义? http://play.golang.org/p/ecvYHiie0P package main import ( "fmt" "sync" "time" ) func dosomething(millisecs time.Duration, wg *sync.WaitGroup) { duration := millisecs * time.Millisecond time.Sleep(duration) fmt.Println("Function in background, duration:", duration) wg.Done() } func main() { var wg sync.WaitGroup wg.Add(4) go dosomething(200, &wg) go dosomething(400, &wg) go dosomething(150, &wg) go dosomething(600, &wg) wg.Wait() fmt.Println("Done") } 结果(如预期): Function […]
此代码select与被调用的可执行文件相同的文件夹中的所有xml文件,并将asynchronous处理应用于callback方法中的每个结果(在下面的示例中,只是打印出文件的名称)。 我如何避免使用睡眠方法来防止主要方法退出? 我有问题缠绕我的头(我假设这是需要的,同步结果),所以任何帮助表示赞赏! package main import ( "fmt" "io/ioutil" "path" "path/filepath" "os" "runtime" "time" ) func eachFile(extension string, callback func(file string)) { exeDir := filepath.Dir(os.Args[0]) files, _ := ioutil.ReadDir(exeDir) for _, f := range files { fileName := f.Name() if extension == path.Ext(fileName) { go callback(fileName) } } } func main() { maxProcs := runtime.NumCPU() […]
TL; TR:请到最后一部分,告诉我你将如何解决这个问题。 我今天早上从Python开始使用Golang。 我想多次调用一个来自Go的闭源代码,带有一些并发性,带有不同的命令行参数。 我的结果代码工作得很好,但我想获得您的input,以改善它。 由于我处于早期学习阶段,所以我也会解释一下我的工作stream程。 为了简单起见,这里假设这个“外部闭源程序”是zenity ,一个Linux命令行工具,可以从命令行显示graphics消息框。 从Go调用可执行文件 所以,在Go中,我会这样做: package main import "os/exec" func main() { cmd := exec.Command("zenity", "–info", "–text='Hello World'") cmd.Run() } 这应该是正确的。 请注意.Run()与.Start()后跟.Wait()的function相同。 这很好,但如果我只想执行一次这个程序,整个编程的东西就不值得。 所以让我们多次这样做。 调用可执行文件多次 现在,我有这个工作,我想多次调用我的程序,自定义命令行参数(这里只是为了简单起见)。 package main import ( "os/exec" "strconv" ) func main() { NumEl := 8 // Number of times the external program is called for i:=0; […]
我最近一直在看Go的goroutine ,认为在Java中有类似的东西会很好。 就我所寻找的并行化方法调用的常见方式而言,就是做类似的事情: final String x = "somethingelse"; new Thread(new Runnable() { public void run() { x.matches("something"); } }).start(); 那不是很优雅。 有没有更好的方法来做到这一点? 我在一个项目中需要这样的解决scheme,所以我决定围绕asynchronous方法调用实现我自己的包装类。 我在J-Go上发布了我的包装类。 但是我不知道这是不是一个好的解决scheme。 用法很简单: SampleClass obj = … FutureResult<Integer> res = … Go go = new Go(obj); go.callLater(res, "intReturningMethod", 10); //10 is a Integer method parameter //… Do something else //… System.out.println("Result: "+res.get()); //Blocks […]
我有一个调用方法的goroutine,并将返回的值传递给一个通道: ch := make(chan int, 100) go func(){ for { ch <- do_stuff() } }() 我怎样才能停止这样的门厅?
我试图用goroutines写一个简单的工作池。 我写的地道代码是惯用的吗? 如果不是,那么应该改变什么? 我希望能够将工作线程的最大数量设置为5,并且阻止,直到一个工作人员变得可用,如果5个人都忙的话。 我怎样才能把这个扩展到最多只有5名工人? 我是否产生了静态的5个work_channel ,并给每个work_channel ? 码: package main import ( "fmt" "math/rand" "sync" "time" ) func worker(id string, work string, o chan string, wg *sync.WaitGroup) { defer wg.Done() sleepMs := rand.Intn(1000) fmt.Printf("worker '%s' received: '%s', sleep %dms\n", id, work, sleepMs) time.Sleep(time.Duration(sleepMs) * time.Millisecond) o <- work + fmt.Sprintf("-%dms", sleepMs) } func main() […]
虽然SayHello()按预期执行,但goroutine不打印任何内容。 package main import "fmt" func SayHello() { for i := 0; i < 10 ; i++ { fmt.Print(i, " ") } } func main() { SayHello() go SayHello() }