使用goroutine/channel求素数问题

栏目: Go · 发布时间: 7年前

内容简介:在学习channel的过程中,看到了一个经典筛选素数的例子,现在将理解思路和里面学到的知识通过注释记录下来,以备学习查看,由于本人技术有限,难免有理解错误,还望看客不吝指出,谢谢此处 在 Processor 中使用go func(){...}() 等同于 go Processor(..)

前言

在学习channel的过程中,看到了一个经典筛选素数的例子,现在将理解思路和里面学到的知识通过注释记录下来,以备学习查看,由于本人技术有限,难免有理解错误,还望看客不吝指出,谢谢

代码与注释

package main    //素数问题

import (
   "fmt"
)

//seq 用以判断的数据源通道,通道首值会作为判断基数,其后数值作为判断值,向下一级别seq通道写值
//wait chan struct{} 作为通知载体,针对空struct内存申请返回的地址都是固定的,避免内存滥用
//level 当前执行 Processor 的级别,以判断Processor执行次数

func Processor(seq <-chan int,wait chan struct{} , level int)  {
   go func() {
      //获取seq通道的初始值和状态,当最后级调用 Processor函数时( seq的数7 ),此时的状态即为false
      prime,ok := <-seq  
      if !ok {
         close(wait)   
	//关闭wait通道,主函数中调用wait通道,起到信号传递功能,否则执行过快不会全部输出
         return           
	//返回,否则会继续向下执行 等同于 if (){ do a ; return } do b ==  if (){ do a }else{ do b}
      }
      fmt.Printf("[%d]:%d\n",level,prime) 	//打印当前级别和判断基数
      out := make(chan int)    			//作为下一级别调用Processor函数时使用的seq通道
      Processor(out,wait,level+1)    		//增加level,并循环调用Processor函数

      //从seq通道中取值
      //level ==1 当prime ==2 num 会取到 3 4 5 6 7 8 9 
      //level ==2 当prime ==3 num 会取到 5 7 9 (所有被2整除的数都被过滤)
      //level ==3 当prime ==5 num 会取到 7
      //level ==4 当prime ==7 num 取不到值 不会进入下面for循环 
      //           导致 out 通道没有数,再次调用Processor时,传入的seq通道状态为false

      for num := range seq{  //从seq通道中读取值,并获取不能整除的数,写入out通道
         if num%prime !=0 { 
            out <-num
         }
      }
      close(out)    //关闭out通道,防止死锁
   }() 
}

func main() {
   origin,wait := make(chan int),make(chan  struct{}) //初始化第一个seq通道和等待信号通道
   Processor(origin,wait,1)

   for i := 2 ; i < 11 ; i++{ 	//向初始通道写入 23456789 的值
      origin <- i
   }
   close(origin)  	//关闭初始通道
   <-wait       		//停止等待信号
}

使用goroutine/channel求素数问题

关于goroutine的作用

此处 在 Processor 中使用go func(){...}() 等同于 go Processor(..)

同步(没有缓存)通道数据的读写应在goroutine 以便多次读写调用,一个goroutine中只能做一类处理(读或写)


以上所述就是小编给大家介绍的《使用goroutine/channel求素数问题》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Programming in Haskell

Programming in Haskell

Graham Hutton / Cambridge University Press / 2007-1-18 / GBP 34.99

Haskell is one of the leading languages for teaching functional programming, enabling students to write simpler and cleaner code, and to learn how to structure and reason about programs. This introduc......一起来看看 《Programming in Haskell》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器