当前位置: 首页 > 面试题库 >

Golang中的并行处理

许兴文
2023-03-14
问题内容

给出以下代码:

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可以求和元