c语言多进程架构改go语言,golang多进程并发
前言
以前听说什么golang一把梭什么的很厉害,到现在位置也接触golang半个多月时间了,最主要的时间都是在看document,学习语法。golang什么的变量名大小写区分公有私有神马的太坑爹了。。。最近接触到了golang最为称赞的第一个地方:goroutine。本篇博客先介绍操作系统中的一些基本语法,然后介绍一下goroutine的美妙之处。
【线程, 进程】; 【多进程,多线程】; 【并发,并行】
线程与进程概念线程:是程序执行流的最小单元,是系统独立调度和分配CPU(独立运行)的基本单位。
进程:是资源分配的基本单位。一个进程包括多个线程
区别线程与资源分配无关,它属于某一个进程,并与进程内的其他线程一起共享进程的资源。
每个进程都有自己一套独立的资源(数据),供其内的所有线程共享。
不论是大小,开销线程要更“轻量级”
一个进程内的线程通信比进程之间的通信更快速,有效。(因为共享变量)
多进程与多线程
多线程:同一时刻执行多个线程。用浏览器一边下载,一边听歌,一边看视频,一边看网页。。。
多进程:同时执行多个程序。如,同事运行YY,QQ,以及各种浏览器。
并发与并行
并发当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间 段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状。.这种方式我们称之为并发(Concurrent)。
并行:当系统有一个以上CPU时,则线程的操作有可能非并发。当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。
举个例子:
并发就是一个窗口多条队伍,多条队伍轮流使用资源。
并行就是多个窗口,每个窗口一个队伍,队伍之间并行排队。
gotuntine
golang语言中,用go关键词就可以启动并发程序。
我们先看一下下面这个简单的例子,在main函数中依次调用了两次loop函数。
func loop() {
for i := 0; i < 10; i++ {
fmt.Printf("%d", i)
}
}
func main() {
loop()
loop()
}
毫无疑问上述代码的运行结果如下:
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
这个时候我们将main函数代码换成如下
func main() {
go loop()
loop()
}
此时loop函数只运行了一次;这是什么原因呢,原来是因为我们的main函数中的第二个loop()执行比较快
在go loop()还没有执行的时候,main函数已经运行结束并且退出了。
0 1 2 3 4 5 6 7 8 9
我们可以使用time.Sleep设置延时来等待go loop()执行,这种做法可行,但是显然是不科学的,如果我的go loop()执行很快结束了,而main函数还在等待,这显然是一种资源上的浪费。
那么如何解决的,我们可以用下面的信道来解决这个问题
func main() {
go loop()
loop()
time.Sleep(time.Seoncd) //停顿一秒
}
信道
信道是什么?简单的来说就是goruntine之间相互通讯的东西。类似Linux中的管道,用来在多个进程之间共享资源。
先看一下例子
func main() {
var chanel chan int = make(chan int) // 定义信道类型变量 chanel
go func(msg string) {
chanel
}("Ping")
msgStr :=
fmt.Println(msgStr)
}
在上述代码中,我们通过定义chanel变量完成了进程间的消息通讯。
通过存消息和取消息两种方法完成进程间的消息通讯。
通过这种方式我们可以控制进程的结束时间
var quit chan int = make(chan int)
func loop() {
for i := 0; i < 10; i++ {
fmt.Printf("%d ", i)
}
quit
}
func main() {
go loop()
loop()
}
我们通过quit来控制loop()的结束时间点,当quit没有取到消息的时候,进程就会阻塞,main函数也就无法继续执行。
如果不用信道来阻塞主线的话,主线就会过早跑完,loop线都没有机会执行、、、
其实,无缓冲的信道永远不会存储数据,只负责数据的流通,为什么这么讲呢?
从无缓冲信道取数据,必须要有数据流进来才可以,否则当前线阻塞
数据流入无缓冲信道, 如果没有其他goroutine来拿走这个数据,那么当前线阻塞
简单来说就是必须有消息流入,并且有消息流出,缺一不可,不然会造成死锁
后续
下一篇博客将会介绍一下死锁以及等待多goruntine的方案
c语言多进程架构改go语言,golang多进程并发相关推荐
- 【Golang第8章:面向对象编程】Go语言的结构体是什么,怎么声明;Golang方法的调用和声明;go语言面向对象实例,go语言工厂模式;golang面向对象的三大特性:继承、封装、多态
介绍 这个是在B站上看边看视频边做的笔记,这一章是Glang面向对象编程 这一章内容较多,内容有Go语言的结构体是什么,怎么声明:Golang方法的调用和声明:go语言面向对象实例,go语言工厂模式: ...
- 架构与开发语言 购OA最重要的两个核心
OA 软件产品的技术架构与开发语言决定了其核心产品的拓展性和跨平台对接等诸多元素结构,最直接的结果是导致产品的二次开发困难.插件组合对接实施困难.跨平台数据对接.维护成本高昂,而负责采购OA产品的技术 ...
- 自学golang【第一章:go语言基础知识】为什么要学习go语言?go语言与c语言的关系?go语言创始人?go语言的特性有哪些?go语言适合做什么?国内外有哪些企业或项目使用go语言?
事先声明:本文部分内容参考了尹成的笔记,如果侵权请联系删除. 我是一名自学go语言的初学者,从今天开始我将会坚持更新go语言的相关知识,从入门到精通,如果大家有什么需要可以加我QQ:239479969 ...
- R语言ggplot2可视化改变线图(line plot)中线条的色彩实战
R语言ggplot2可视化改变线图(line plot)中线条的色彩实战 目录 R语言ggplot2可视化改变线图(line plot)中线条的色彩实战
- java 环境变量 locale,修改locale把语言环境变量改为英文
把语言环境变量改为英文 将Ubuntu系统语言环境改为英文的en_US.UTF-8 查看当前系统语言环境 locale 编辑配置文件,将zh_US.UTF-8改为en_US.UTF-8,zh改为en ...
- cs架构用什么语言开发_C、C++、Go 语言、Linux服务器开发高级架构师进阶之路
C++这门语言从诞生到今天已经经历了将近30个年头.不可否认,它的学习难度都比其它语言较高.而它的学习难度,主要来自于它的复杂性. 现在C++的使用范围比以前已经少了很多,Java.C#.Python ...
- python语言发明者 google_谷歌的语言何以战胜Python?50%的人都应该立即学习Golang...
全文共2623字,预计学习时长9分钟 图源:dailybtc 很多软件工程师视Python为最喜爱的语言之一,工作生活都和它死死绑定在一起.但Google, Uber, Dropbox, Soundc ...
- c语言运行k值不变,C语言期末复习(改完).doc
C语言期末复习(改完).doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. 3.该文档 ...
- 把语言环境变量改为英文
修改locale 把语言环境变量改为英文 将Ubuntu系统语言环境改为英文的en_US.UTF-8 查看当前系统语言环境 locale 编辑配置文件,将zh_US.UTF-8改为en_US.UTF- ...
最新文章
- [转]Mysql中的SQL优化与执行计划
- 今天悄悄的给你说几个HashCode的破事。
- 计算机二级vfp模拟考试题,计算机等级考试二级VFP模拟练习题[10]
- Linux中添加pycharm源,linux下python+pycharm安装
- 【转载】DataKeyNames,DataKeys 用法浅谈
- mongodb 排序_技术分享 | MongoDB 一次排序超过内存限制的排查
- 软件测试岗需要会什么条件,应聘软件测试岗位需要具备什么条件?
- go post请求的响应数据渲染到html模板_干货你需要了解的六种渲染模式
- 重新分区_电脑磁盘分区指南!一分钟就学会
- pytorch dropout代码解读
- 如何调整iMindMap打印设置
- @C/C++ 运行后的dos窗口的暂停
- 「Mac小技巧」教你如何解决WiFi的国家地区代码冲突
- java 打印对象_java中直接打印对象
- ios 获取沙盒文件名_iOS 获取沙盒文件路径及 写入/删除 沙盒文件
- Golang 多版本管理神器 gvm
- 软件测试工程师基础类面试题及参考答案
- VS2008,C++,镜子反射 光线反射游戏
- 探寻平台经济健康发展和垄断规制
- 新品周刊 | 内马尔携手极度干燥推出内衣系列;安踏儿童与中国航天推出热返科技羽绒服...