Coroutine基于基于线程的轻量级存在,其设计存在于并发。
关于Coroutine的详细概念,我不打算在本文中记录记录。本文与实验比较更相似
如果您想反映Coroutine的效率,则必须找到一个应用程序方案,并且合并排序可以由Coroutine实施吗?
合并和排序的经典“分区和规则”算法之一,首先将数组分为无法分裂,然后返回两个数组。
这里的功能主要是两个有序的组。如果您不在这里开始,请观察上述代码,我们可以轻松地同时引入优势:
实际上,无需在这个地方同步计算。只要保证在上次合并之前执行两个函数,就可以异步执行两个函数。
借助上述基础,让我们看看Golang如何实现上述功能。Go拥有Goroutine,它具有自然的并发优势,并且使用非常简单。您只需要在要执行并发执行之前添加关键字。
当然,以上程序可能没有输出,因为主函数的goroutine运行得太快了,该方法的goroutine尚未执行打印字符的代码,该程序已经结束。
在最终合并必须结束之前,递归划分之前也有人说。如果简单地添加关键字,则要求无法满足要求。
但是,GO还提供解决方案,这实际上非常简单。添加一个锁。当执行Goroutine并释放锁定时,因此当Goroutine未结束时,该程序将不会退出,因为锁将退出。
变量是可以这样使用的同步方法。当我们申请Goroutine时,添加1。执行Goroutine时,它将减少1,它将阻止并等待直到变量值变为0。
这样,我们可以使用Go编写第一个版本的Mergesort:
有问题吗?我们可以编写一个单位测试,以与Mergesort相比,没有Goroutine。
单位测试如下:
发现运行单元测试:
结果,性能变得比我们预期的要差,并且在goroutine之后的性能变得更糟。这是怎么回事?看来,在计算计算过程中,我们疯狂地申请了Goroutine。对于每个步骤递归,我们将申请两个goroutine。这最终将生产数百万的goroutine,以排队机制竞争CPU,这使代码较慢。
那么,我们如何在不设置大量goroutine的情况下获得并发代码的性能优势?限制GO并发的好方法是使用缓冲通道信号量。根据我们想要的并发操作单元的数量执行。
我们设置了一个容量为100的频道。当我们生成Goroutine执行异步计算时,如果已经有100个Goroutine繁忙的计算,我们将恢复Mergesort的同步版:
单位测试结果:
可以看出,性能得到了提高。
python的Coroutine由语法宣布,这是编写应用程序的推荐方法。
在这里关注的重点是:
可以与关键字和比较结合。这样,我们很容易编写合并和分类Python Corporate版本: