给出以下代码:
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
for i := 0; i < 3; i++ {
go f(i)
}
// prevent main from exiting immediately
var input string
fmt.Scanln(&input)
}
func f(n int) {
for i := 0; i < 10; i++ {
dowork(n, i)
amt := time.Duration(rand.Intn(250))
time.Sleep(time.Millisecond * amt)
}
}
func dowork(goroutine, loopindex int) {
// simulate work
time.Sleep(time.Second * time.Duration(5))
fmt.Printf("gr[%d]: i=%d\n", goroutine, loopindex)
}
我可以假设’dowork’函数将并行执行吗?
这是实现并行性的正确方法,还是对每个goroutine使用通道并将单独的“ workwork”工人分开更好?
关于GOMAXPROCS,您可以在Go 1.5的发行文档中找到:
默认情况下,Go程序在将GOMAXPROCS设置为可用内核数的情况下运行;在以前的版本中,它默认为1。
关于防止main功能立即退出,您可以利用WaitGroup的Wait功能。
我写了这个实用程序函数来帮助并行化一组函数:
import "sync"
// Parallelize parallelizes the function calls
func Parallelize(functions ...func()) {
var waitGroup sync.WaitGroup
waitGroup.Add(len(functions))
defer waitGroup.Wait()
for _, function := range functions {
go func(copy func()) {
defer waitGroup.Done()
copy()
}(function)
}
}
所以在您的情况下,我们可以这样做
func1 := func() {
f(0)
}
func2 = func() {
f(1)
}
func3 = func() {
f(2)
}
Parallelize(func1, func2, func3)
如果要使用Parallelize函数,可以在这里找到它https://github.com/shomali11/util
问题内容: 什么是在python 2.7中进行并行处理的简单代码?我在网上找到的所有示例都是令人费解的,其中包括不必要的代码。 我如何做一个简单的蛮力整数分解程序,在其中我可以在每个核(4)上分解一个整数?我的真实程序可能只需要2个内核,并且需要共享信息。 我知道并存python和其他库,但是我想将使用的库数保持最少,因此我想使用和/或库,因为它们是python附带的 问题答案: 从python中
问题内容: 我有以下几点: 背景图片(双) 图像1(i1) 图像3(i2) 我想将i1和i2以一定角度放置在bi上,然后生成最终图像。我有i1和i2的x和y轴值及其预期的旋转角度。i1和i2可能部分重叠。但是我知道i1和i2的z索引,如果它们重叠,那么谁将在前景。 我正在努力在Golang中实现这一目标。 http://golang.org/doc/articles/image_draw.html
问题内容: 我正在编写一个程序来处理文本文件中的数百万行,500k耗时5秒来验证文件,我想加快速度。 我想遍历所有项目并异步处理它们中的x,然后等待响应以查看是否应该继续。 我已经写了一些伪代码,我不确定我写的内容是否有意义,这看起来似乎很复杂,是否有更简单,更优雅的方法来做到这一点。 问题答案: 您的代码看起来不错,您实现了Go模式中常用的代码。缺点是- 您为每个项目生成工作程序goroutin
问题内容: Golang支持将当前的goroutine专门绑定到当前的OS线程,它也可以。 是否有任何使用案例可以从此功能中受益? 问题答案: 使用Go线程模型时,对C代码,汇编代码或阻塞系统调用的调用与通过Go运行时调度程序管理的调用Go代码在同一线程中发生。 当Go必须与某些外部库(例如C库)接口时,该机制最有用。它保证将在同一线程中完成对该库的多次连续调用。 这在几种情况下很有趣: 许多图形
问题内容: 我有多个Goroutines共享一个net.Conn对象。他们可以同时发出写呼叫吗? 我主要关心的是部分完成的Write调用。假设我打算写100个字节,但是只发送了30个字节,因此我需要再发送70个字节。为此,我通常会编写一个循环: 但是我看到Go在net.Conn.Write行号318中实现了这个循环,它是通过锁来实现的。 但是,在Windows实现上,除了调用WSASend之外没有
本文向大家介绍处理执行中的并行性类型,包括了处理执行中的并行性类型的使用技巧和注意事项,需要的朋友参考一下 数据并行 数据并行意味着在每个多个计算核心上并发执行同一任务。 让我们举个例子,对大小为N的数组的内容求和。对于单核系统,一个线程将简单地对元素[0]求和。。。[N-1]。但是,对于双核系统,在核0上运行的线程A可以对元素[0]求和。。。[N / 2-1],而在核心1上运行的线程B可以求和元