• go_goroutine and channel


    协程Coroutine

    轻量级”线程“

    非抢占式多任务处理,由协程主动交出控制权(如果程序中间没有print,程序会一直霸占着调度器)

    编译器/解释器/虚拟机层面的多任务

    多个协程可能在一个或多个线程上运行

    goroutine可能的切换点

    1.I/O,select

    2.channel

    3.等待锁

    4.函数调用(有时)

    5.runtime.Gosched()

    package main
    
    import (
    	"fmt"
    	"time"
    	"runtime"
    )
    
    func main() {
    	var a [10]int
    	for i:=0;i<10;i++{
    		go func(i int) {
    			for {
    				//fmt.Printf("hello from "+"gorounting %d
    ",i)
    				a[i]++
    				runtime.Gosched()
    			}
    
    		}(i)//表示取之于外面的i
    	}
    	time.Sleep(time.Millisecond)
    	fmt.Println(a)
    }
    

    通道可以被显式的关闭;尽管它们和文件不同:不必每次都关闭。只有在当需要告诉接收者不会再提供新的值的时候,才需要关闭通道。只有发送者需要关闭通道,接收者永远不会需要。

    从不同的并发执行的协程中获取值可以通过关键字select来完成,它和switch控制语句非常相似也被称作通信开关;它的行为像是“你准备好了吗”的轮询机制;select监听进入通道的数据,也可以是用通道发送值的时候。

    select {
    case u:= <- ch1:
            ...
    case v:= <- ch2:
            ...
            ...
    default: // no value ready to be received
            ...
    }
    

      

  • 相关阅读:
    cisco 4500X 交换机限速
    HPE 交换机基础配置
    MySQL数据库之主从复制
    MySQL复制线程状态转变
    MySQL数据库备份之mysqldump
    MySQL数据库之慢查询日志
    MySQL数据库之多线程备份工具mydumper
    MySQL数据库之索引
    MySQL之二进制日志
    MySQL数据库之sql_mode解释
  • 原文地址:https://www.cnblogs.com/luffe/p/8555434.html
Copyright © 2020-2023  润新知