草庐IT

concurrently

全部标签

concurrency - 我什么时候应该在 Go 中使用并发?

那么除了处理多个服务器请求之外,还有其他时间与并发相关吗?我问是因为它是如此内置于语言中,如果我不使用它,我会觉得很浪费,但我几乎找不到它的用途。 最佳答案 (还)不是Go方面的专家,但我想说:只要最容易这样做。Go中并发模型的美妙之处在于,它从根本上不是一个多核架构,它在事情通常会中断的地方进行检查和平衡——它是一种多线程范式,不仅非常适合在多核架构中,它也非常适合分布式系统架构。您不必为多个goroutines进行特殊安排就可以和谐地协同工作-他们就是这样做的!这是一个自然并发算法的示例-我想将多个channel合并为一个。一旦

concurrency - 在 Go 中分配指针是原子的吗?

在Go中分配指针是原子的吗?我需要在锁中分配一个指针吗?假设我只想将指针分配给nil,并希望其他线程能够看到它。我知道在Java中我们可以为此使用volatile,但Go中没有volatile。 最佳答案 在go中唯一保证是原子的就是sync.atomic中的操作。.所以如果你想确定你要么需要锁,例如sync.Mutex或使用原子原语之一。我不建议使用原子原语,因为您必须在使用指针的任何地方都使用它们,而且它们很难正确使用。使用互斥锁是可以的——你可以定义一个函数来很容易地返回当前指针并锁定,例如import"sync"varsec

concurrency - 多个 goroutine 打印到标准输出是否安全?

我的程序中有多个goroutine,每个goroutine都调用fmt.Println而没有任何显式同步。这是安全的(即,每一行是否会单独显示而不会损坏数据),还是我需要创建另一个具有同步功能的goroutine来专门处理打印? 最佳答案 不,即使您有时可能观察不到任何问题,这也不安全。IIRC,fmt包试图保证安全,因此可能会发生某种混合,但希望不会出现进程崩溃。这是更通用的Go文档规则的一个实例:除非另有说明或从上下文中显而易见,否则事物对于并发访问是不安全的。通过一些小的初始设置,使用log包可以获得fmt.Print*功能子

concurrency - 匿名结构和空结构

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是

concurrency - 为高并发应用程序实现全局计数器的最佳方法?

这个问题在这里已经有了答案:Howtocreateglobalcounterinhighlyconcurrentsystem(3个回答)关闭5个月前。为高并发应用程序实现全局计数器的最佳方法是什么?就我而言,我可能有10K-20K的例程执行“工作”,我想计算例程共同处理的项目的数量和类型......“经典”同步编码风格如下所示:varwork_counterintfuncGoWorkerRoutine(){for{//doworkatomic.AddInt32(&work_counter,1)}}现在这变得更复杂了,因为我想跟踪正在完成的工作的“类型”,所以我真的需要这样的东西:var

java - "Java Concurrency In Practice"仍然有效吗?

已结束。此问题不符合StackOverflowguidelines.它目前不接受答案。我们不允许提出有关书籍、工具、软件库等方面的建议的问题。您可以编辑问题,以便用事实和引用来回答它。关闭5年前。Improvethisquestion是JavaConcurrencyinPractice仍然有效?我想知道书中描述的想法、概念和实现是否仍然与最新的Java版本兼容。我问是因为最新版本是2006年完成的。 最佳答案 虽然我的观点可能有偏见,但我目前更新这本书的意图几乎是严格附加的,包括fork-join、并行分解和JavaSE8中新的并行

concurrency - Go并发和 channel 困惑

我是Go新手,在理解并发和channel方面存在问题。packagemainimport"fmt"funcdisplay(msgstring,cchanbool){fmt.Println("displayfirstmessage:",msg)c程序的输出是:displayfirstmessage:hello10000000000但我认为应该只有一行:displayfirstmessage:hello所以在main函数中,display和sum同时运行,sum需要更长的时间,所以display应该向c发送true并且程序应该在sum完成之前退出......我不确定我是否理解清楚。有人可以

concurrency - Go并发和 channel 困惑

我是Go新手,在理解并发和channel方面存在问题。packagemainimport"fmt"funcdisplay(msgstring,cchanbool){fmt.Println("displayfirstmessage:",msg)c程序的输出是:displayfirstmessage:hello10000000000但我认为应该只有一行:displayfirstmessage:hello所以在main函数中,display和sum同时运行,sum需要更长的时间,所以display应该向c发送true并且程序应该在sum完成之前退出......我不确定我是否理解清楚。有人可以

concurrency - Go 中惯用的可变大小工作池

我正在尝试在Go中实现一个worker池。go-wiki(以及Channels部分中的EffectiveGo)提供了边界资源使用的优秀示例。只需使用与工作池一样大的缓冲区创建一个channel。然后用worker填充该channel,并在完成后将它们发送回channel。从channel阻塞接收,直到有工作人员可用。所以channel和循环就是整个实现——非常酷!或者,可以阻止发送到channel,但同样的想法。我的问题是关于在运行时更改工作池的大小。我不相信有办法改变channel的大小。我有一些想法,但大多数似乎都太复杂了。Thispage实际上使用channel和空结构以几乎相同

concurrency - Go 中惯用的可变大小工作池

我正在尝试在Go中实现一个worker池。go-wiki(以及Channels部分中的EffectiveGo)提供了边界资源使用的优秀示例。只需使用与工作池一样大的缓冲区创建一个channel。然后用worker填充该channel,并在完成后将它们发送回channel。从channel阻塞接收,直到有工作人员可用。所以channel和循环就是整个实现——非常酷!或者,可以阻止发送到channel,但同样的想法。我的问题是关于在运行时更改工作池的大小。我不相信有办法改变channel的大小。我有一些想法,但大多数似乎都太复杂了。Thispage实际上使用channel和空结构以几乎相同