concurrent-collections
全部标签 我是Golang的新手。现在我正在尝试弄清楚如何在Golang中创建一个任意对一的channel,其中设置如下:假设我有两个goroutinenumgen1和numgen2同时执行并将数字分别写入channelnum1。编号2。我想在一个新进程addnum中添加从numgen1和numgen2发送的数字。我尝试过这样的事情:funcaddnum(num1,num2,sumchanint){done:=make(chanbool)gofunc(){n1:=但这似乎很不正确。有人可以给我一些想法吗?非常感谢您的帮助。 最佳答案 根据您的
在python中是否有任何类似于'Set'的Go集合?替代方案:有没有在Go中实现Set的简单方法?有什么方法可以消除slice中的重复项吗? 最佳答案 您可以只拥有一个map[whatevertype]bool并将值设置为true。您可以将slice中的每个元素添加为映射键,然后使用range仅取出唯一的元素。packagemainimport"fmt"funcmain(){m:=make(map[string]bool)s:=make([]string,0)s=append(s,"foo")s=append(s,"foo")s=
我有一个指向由Go结构包裹的C类型的指针,如下所示:typeWrapperstruct{unmanaged*C.my_c_type}C类型又具有以下功能:my_c_type*make_c_type();voidfree_c_type(my_c_type*ct);有没有一种方法可以确保在Wrapper实例完成时调用free_c_type? 最佳答案 您可以使用runtime.SetFinalizer.这允许您在对象超出范围时运行清理功能。不保证运行。但是,在释放内存时,这并不重要。重要的是,对于一个长时间运行的进程,它可能会控制垃圾。
这个想法是在一个slice中拥有可变数量的channel,将通过它们接收到的每个值推送到单个channel中,并在最后一个输入channel关闭后关闭此输出channel。像这样,但对于两个以上的channel:funcmultiplex(cin1,cin2,coutchanint){n:=2for{select{casev,ok:=上面的代码避免了忙循环,因为没有default情况,这很好(编辑:看起来“,ok”的存在使得选择语句非阻塞,循环是毕竟很忙。但是为了这个例子,把代码想象成它会阻塞)。是否也可以通过任意数量的输入channel来实现相同的功能?显然,这可以通过将slice成
我想做的是拥有一组生产者goroutine(其中一些可能完成也可能不完成)和一个消费者例程。问题在于括号中的警告-我们不知道将返回答案的总数。所以我想做的是:packagemainimport("fmt""math/rand")funcproducer(cchanint){//Mayormaynotproduce.success:=rand.Float32()>0.5ifsuccess{c所以问题是,如果我关闭它是错误的,如果我不关闭它仍然是错误的(参见代码中的注释)。现在,解决方案将是一个带外信号channel,所有生产者都写入:packagemainimport("fmt""mat
那么除了处理多个服务器请求之外,还有其他时间与并发相关吗?我问是因为它是如此内置于语言中,如果我不使用它,我会觉得很浪费,但我几乎找不到它的用途。 最佳答案 (还)不是Go方面的专家,但我想说:只要最容易这样做。Go中并发模型的美妙之处在于,它从根本上不是一个多核架构,它在事情通常会中断的地方进行检查和平衡——它是一种多线程范式,不仅非常适合在多核架构中,它也非常适合分布式系统架构。您不必为多个goroutines进行特殊安排就可以和谐地协同工作-他们就是这样做的!这是一个自然并发算法的示例-我想将多个channel合并为一个。一旦
在Go中分配指针是原子的吗?我需要在锁中分配一个指针吗?假设我只想将指针分配给nil,并希望其他线程能够看到它。我知道在Java中我们可以为此使用volatile,但Go中没有volatile。 最佳答案 在go中唯一保证是原子的就是sync.atomic中的操作。.所以如果你想确定你要么需要锁,例如sync.Mutex或使用原子原语之一。我不建议使用原子原语,因为您必须在使用指针的任何地方都使用它们,而且它们很难正确使用。使用互斥锁是可以的——你可以定义一个函数来很容易地返回当前指针并锁定,例如import"sync"varsec
我的程序中有多个goroutine,每个goroutine都调用fmt.Println而没有任何显式同步。这是安全的(即,每一行是否会单独显示而不会损坏数据),还是我需要创建另一个具有同步功能的goroutine来专门处理打印? 最佳答案 不,即使您有时可能观察不到任何问题,这也不安全。IIRC,fmt包试图保证安全,因此可能会发生某种混合,但希望不会出现进程崩溃。这是更通用的Go文档规则的一个实例:除非另有说明或从上下文中显而易见,否则事物对于并发访问是不安全的。通过一些小的初始设置,使用log包可以获得fmt.Print*功能子
http://play.golang.org/p/vhaKi5uVmmpackagemainimport"fmt"varbattle=make(chanstring)funcwarrior(namestring,donechanstruct{}){select{caseopponent:=[第一个问题]done我们如何以及为什么需要这个看起来很奇怪的结构?它是空结构还是匿名结构?我用谷歌搜索了它,但找不到正确的答案或文档来解释这一点。原文来自AndrewGerrand的演讲http://nf.wh3rd.net/10things/#10这里make(chanstruct{})done是
有时您可能希望避免/最小化垃圾收集器,所以我想确定如何去做。我认为下一个是正确的:在函数开头声明变量。使用数组代替slice。还有吗? 最佳答案 要最小化Go中的垃圾收集,您必须最小化堆分配。为了尽量减少堆分配,您必须了解分配发生的时间。以下事情总是会导致分配(至少在Go1的gc编译器中):使用new内置函数使用make内置函数(少数不太可能的极端情况除外)当值类型是slice、映射或带有&运算符的结构时的复合文字将大于机器字的值放入接口(interface)。(例如,字符串、slice和某些结构比机器字大。)string、[]by