Go 中的 Channel 背后的设计哲学
最近在知乎上看到一段非常有趣的代码,用来解决“寻找10000以内的素数”问题。实现起来非常有趣,我们先看一下这段代码:
这段代码的思想基础是1978年的CSP (Communicating Sequential Processes)论文提出的CSP应用的经典问题:
Problem: To print in ascending order all primes less than 10000. Use an array of processes, SIEVE, in which each process inputs a prime from its predecessor and prints it. The process then inputs an ascending stream of numbers from its predecessor and passes them on to its successor, suppressing any that are multiples of the original prime.
中文翻译过来就是:
升序打印10000以内的素数,可以采用筛选法,也就是从2开始每找到一个素数就标记所有能被该素数整除的所有数。直到没有可标记的数,剩下的就都是素数
按照这个思路,我们可以用简单的方法来实现:
这个使用循环做的,其实我们可以用递归来完成,也就是递归处理筛后的数据,这里我们就不写这种方法了,但是递归这个思想就是上面的代码所做的事情 (这里我们省略CSP和Go语言channel的相关内容,只做必要的描述,这些内容将在后面的内容专门讲,也是一个很有趣的设计):
这里和传统的递归算法大体上没什么区别,我们可以看到这里多的是通道,也就是CSP中的设计哲学:用通信共享内存来实现并发。我们在以后的文章会讲解到为什么CSP这么重要,它是如何做到让编写并发程序变得像串行程序一样简单。
参考链接
版权声明: 本文为 InfoQ 作者【soolaugust】的原创文章。
原文链接:【http://xie.infoq.cn/article/1d27efd1467b95a2fb312b992】。未经作者许可,禁止转载。
评论