协程与通道

进程:计算机进行资源分配调度的基本单位。且运行在自己内存空间内的独立执行体
(一个应用程序就是运行在机器上的一个进程)
线程:进程内部共享进程内存资源的多个执行体(当一个线程进行IO时,换另一个线程执行)

并行:同一个程序在某个时间点同时运行在多个处理器核心上。
并发:同一时间段内,多个线程执行任务(提高ICU的时间使用率)

协程:根据一个或多个线程的可用性,映射到线程之上(Go tuntime中调度)

同步:进程的多个线程(或者协程)中数据一致

协程工作在相同的地址空间中,所以共享内存(sync包)的方式一定是同步的。(不鼓励使用共享内存的方式来达到同步)
Go使用channels来同步协程
当系统调用(IO等待等)当前线程的当前协程被阻塞时,当前线程的其余协程会继续在其它线程上工作。
协程(特别轻量,只有4k)
协程可以运行在多个操作系统线程之间(多个线程之间来回跑。),也可以运行在线程之内(呆在一个线程上面)

两种并发方式:
确定性的(明确定义排序),Go的通道,先发送者后接收者(有先后之分)
非确定性的(加锁/互斥),Java的多线程,随机,谁抢到就是谁的
线程通过关键字go调用一个方法或函数实现(也可以时匿名函数)
在当前线程开始一个同时运行的协程。go sum(a,b)
协程的栈(自己建的)会根据需要进行伸缩,不会出现栈溢出。协程没有返回值
main() 也可以看作一个协程。
协程可以在init()(程序初始化)中运行。
runtime.Gosched()。当前协程让出处理器。

GOMAXPROCS,Go应用程序的线程数量(并行协程的最大数量,不过肯定是要小于处理器核心数的)。

如果GOMAXPROCS >= n,则这些线程会被分散到n个处理器核心上(假设计算机处理核心有n个)

在代码中指定使用的线程数
使用flags包
var numCores = flag.Int("n",2,"number of CPU cores to use")
flag.Parse()
runtime.GOMAXPROCS(*numCores)

原文地址:https://www.cnblogs.com/mcmx/p/11390896.html

时间: 2024-11-07 19:14:27

协程与通道的相关文章

GO 协程 通道实例以及验证SnowFlake算法

最近项目中使用了SnowFlake算法产生ID,并在实际运行环境下会产生重复ID,所以写了一个Go的程序进行验证,顺便也练习一下Go的协程与通道. 至于GO的协程和通道的基础知识请自行百度. 代码如下: package main import ( "fmt" "github.com/zheng-ji/goSnowFlake" ) func main() { fmt.Println("Hell Go !") iw, err := goSnowFla

go协程

一.并发&并行 一个应用程序  ---> 一个进程 ---> 运行在自己内存地址空间里的独立执行体 ---> 同一个内存地址空间的一起工作的多个线程 一个并发程序 ---> 多个线程来执行任务 ---> 某个时间点同时运行在多核或者多处理器 ---> 并发&并行 ---> 某个时间点同时运行在单个处理器     --\---> 并发&不并行 并行是一种通过使用多处理器以提高速度的能力.所以并发程序可以是并行的,也可以不是. 公认的,使

Python与Golang协程异同

背景知识 这里先给出一些常用的知识点简要说明,以便理解后面的文章内容. 进程的定义: 进程,是计算机中已运行程序的实体.程序本身只是指令.数据及其组织形式的描述,进程才是程序的真正运行实例. 线程的定义: 操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位. 进程和线程的关系: 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务. CPU的最小调度单元是线程不是进程,所以单进程多线程也可以利用多核CPU. 协程的定义: 协

golang协程——通道channel阻塞

新的一年开始了,不管今天以前发生了什么,向前看,就够了. 说到channel,就一定要说一说线程了.任何实际项目,无论大小,并发是必然存在的.并发的存在,就涉及到线程通信.在当下的开发语言中,线程通讯主要有两种,共享内存与消息传递.共享内存一定都很熟悉,通过共同操作同一对象,实现线程间通讯.消息传递即通过类似聊天的方式.golang对并发的处理采用了协程的技术.golang的goroutine就是协程的实现.协程的概念很早就有,简单的理解为轻量级线程,goroutine就是为了解决并发任务间的通

 PHP_Yield协程从入门到精通

本文和大家分享的主要是PHP中Yield协程相关内容,一起来看看吧,希望对大家学习php有所帮助. 协程 基本概念 "协程"(Coroutine)概念最早由 Melvin Conway 于1958年提出.协程可以理解为纯用户态的线程,其通过协作而不是抢占来进行切换.相对于进程或者线程,协程所有的操作都可以在用户态完成,创建和切换的消耗更低.总的来说,协程为协同任务提供了一种运行时抽象,这种抽象非常适合于协同多任务调度和数据流处理.在现代操作系统和编程语言中,因为用户态线程切换代价比内核

go 协程

一.什么是协程? 二.管道channel 通道(channel),就像一个可以用于发送类型化数据的管道,由其负责协程之间的通信,从而避开所有由共享内存导致的陷阱:这种通过通道进行通信的方式保证了同步性 声明的格式: var identifier chan datatype 未初始化的通道的值是nil. 2.1通信操作符 这个操作符直观的标示了数据的传输:信息按照箭头的方向流动. 流向通道(发送) ch <- int1 表示:用通道 ch 发送变量 int1(双目运算符,中缀 = 发送) 原文地址

Python学习之路-随笔03 多线程/进程和协程(上篇)

最近东西积攒了太多,感觉再不写进来就要炸了. 1.多线程 1.11 关于多线程的包 相关的python包有几个,比如thread包,到py3改成_thread,而thread有一些问题使得不是很好用.通用的包叫threading.最近都是在用这个. 1.12 threading的使用和常用属性 需要注意的点有生成实例比如t = threading.Thread(target=xxx, args=(xx,)),里面有两个参数,第一个是目标函数,第二个是相关的参数,注意类型. 然后就是start启动

PHP 协程:Go + Chan + Defer

Swoole4为PHP语言提供了强大的CSP协程编程模式.底层提供了3个关键词,可以方便地实现各类功能. Swoole4提供的PHP协程语法借鉴自Golang,在此向GO开发组致敬 PHP+Swoole协程可以与Golang很好地互补.Golang:静态语言,严谨强大性能好,PHP+Swoole:动态语言,灵活简单易用 本文基于Swoole-4.2.9和PHP-7.2.9版本 关键词 go :创建一个协程 chan :创建一个通道 defer :延迟任务,在协程退出时执行,先进后出 这3个功能底

golang 单协程和多协程的性能测试

测试数据:单协程操作1亿数据,以及多协程(10条协程)操作1亿数据(每条协程操作1kw数据) 废话少说,贴代码: 单协程测试运算: package main import ( "fmt" "time" ) func testNum(num int) { for i := 1; i <= 10000000; i++{ num = num + i num = num - i num = num * i num = num / i } } func main() {