大家好,今天,我将整理GO语言的内容并分享知识的内容并与所有人分享。请建议,谢谢。
本文主要在同步标准库中介绍基本同步,并介绍和使用。
条件变量
COND实现条件变量在事件发生时等待或宣布Goroutine的交集。在此定义中,“事件”是指两个或更多Goroutine之间的任何信号,仅指事件,不包括任何其他信息通常,您可能想在收到goroutine信号之前等待。
每个频道都有一个相关的储物柜L(通常或或或或或或或或或或或或或呼叫方法,必须在第一次使用后复制。
功能:返回新的con和储物柜L
方法:广播将唤醒所有等待C Goroutine
方法:信号唤醒了一个goroutine等待c
方法:等待自动解锁c.l并暂停goroutine的执行。稍后恢复执行后,等待锁定c.l c.l,然后返回返回。(主要用于等待信号通知)
补充:
该方法将自动解锁条件变量关联的锁,并将其阻止其位于位置。接收到通知,将唤醒该方法所在的Goroutine,该方法将立即尝试锁定锁定。
该方法的作用是发送通知以唤醒被阻止的gor绕。
示例1:假设我们有一个固定长度为2的队列,我们必须将10个元素放在队列中。希望有空间可以放入,因此您需要立即通知队列中的空间。
输出
示例2:介绍另一种方法,该方法提供了一种解决方案,可以同时与多个goroutine通信。建立使用按钮的GUI程序。该程序需要任何数量的注册号码的函数。当您单击按钮运行这些功能时,您可以使用COND通知所有注册功能。
输出
一个时间执行
一次仅执行一次的主要作用,并且在首次使用后不会复制它。
方法:当第一次调用一次的实例时,do会调用function f.in ershest.do(f)多次调用,即使第一个呼叫也会调用f,即使f每个呼叫中都有不同的值。一次新实例需要一次启动函数。
输出
确保即使在不同的Goroutine上,调用DO的功能也仅执行一次。
临时对象池
池是一组临时对象,可以单独存储和检索。任何存储在池中的项目可以随时自动删除,而无需通知。如果池在发生这种情况时保留唯一参考,则可以释放该项目。
池可以同时由多个Goroutine使用。
游泳池的目的是缓存已分配但不使用的物品以稍后重复使用以减轻垃圾收集器的压力。不适用于所有免费列表。
正确使用池是管理一组临时项目。这些临时项目是在数据包的并发客户端之间共享的,并且可以由包装的独立客户端重复使用。Pool提供了一种摊销多个客户之间开销的分配的方法。
在高级别上,池模式是创建和提供固定数量对象的一种方法。它通常用于限制创建昂贵资源的事物(例如数据库连接)。GO可以通过多个例程安全地使用。
一个很好的例子是在FMT软件包中,该软件包维护一个动态的临时输出缓冲区存储。在负载下(主动打印了许多goroutines时)存储,在静音时收缩。
请注意,对象的一部分生存期的空闲列表不适合池,因为在这种情况下,支出不会及时摊销。
方法:从池中选择任何项目,将其从池中删除,然后将其返回到呼叫者。您可以选择忽略池并将其视为空。值传递给返回值。
如果Get Will将返回零,而不是零,则Get将返回呼叫的结果。
方法:将X添加到池中。
示例1:池的主要接口是其GET方法。调用调用后,将首先检查池中是否有可用的实例返回呼叫者。如果不是,请创建一个新的成员变量。使用后,呼叫者呼叫将其放入池中用于其他进程的情况。
输出
示例2:指定内存的分配
输出
在这种情况下,如果不使用它,则可能需要分配千兆字节的内存。在目前,只有4KB被分配以使用设置对象池。
示例3:池的另一种常见情况是预热分布对象的缓存,这些对象用于尽快操作。通过减少对另一个对象的引用来减少消费者的时间消耗。
在显示此示例时,池模式非常适合需要并发的应用程序,或构建可能对内存产生负面影响的这些对象。
但是,在确定是否应该使用池时,您需要注意:如果池中的事物在内存中并不大致均匀,它将花费更多的时间从池中搜索,这比第一个实例更实例化。它的资源。
因此,使用池时,请记住以下几点:
最后,总结临时对象池的特征:
技术文章继续进行更新,请更多注意~~
搜索微信公共帐户,关注我[Moer Mountain Gunner]
参考
[1]“ go of of of of of of of poalalleal编程“书”
[2]:“ go“书”中的并发
[3] https://pkg.go.dev/sync同步标准库
原始:https://juejin.cn/post/71003709809319175