-
Go语音聊天服务器
所属栏目:[语言] 日期:2023-07-03 热度:3891
服务端程序中包含 4 个 goroutine,分别是一个主 goroutine 和广播(broadcaster)goroutine,每一个连接里面又包含一个连接处理(handleConn)goroutine 和一个客户写入(clientwriter)goroutine。
广播器(bro[详细] -
Go语言CSP:通信顺序进程概述
所属栏目:[语言] 日期:2023-07-03 热度:8823
Go实现了两种并发形式,第一种是大家普遍认知的多线程共享内存,其实就是 Java 或 C++ 等语言中的多线程开发;另外一种是Go语言特有的,也是Go语言推荐的 CSP(communicating sequential processes)并发模型。
C[详细] -
Go语言死锁、活锁和饥饿简述
所属栏目:[语言] 日期:2023-07-03 热度:6162
死锁是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进[详细]
-
Go语言等待组 (同步.等待组)
所属栏目:[语言] 日期:2023-07-03 热度:3644
Go语言中除了可以使用通道(channel)和互斥锁进行两个并发程序间的同步外,还可以使用等待组进行多个任务的同步,等待组可以保证在并发环境中完成指定数量的任务
在 sync.WaitGroup(等待组)类型中,每个 sync.[详细] -
Go语言互斥锁(sync.Mutex)与读写互斥锁(sync.RWMutex)
所属栏目:[语言] 日期:2023-07-03 热度:234
Go语言包中的 sync 包提供了两种锁类型:sync.Mutex 和 sync.RWMutex。
Mutex 是最简单的一种锁类型,同时也比较暴力,当一个 goroutine 获得了 Mutex 后,其他 goroutine 就只能乖乖等到这个 goroutine 释放该 M[详细] -
Go语言的多核并行性研究
所属栏目:[语言] 日期:2023-07-03 热度:3016
Go语言具有支持高并发的特性,可以很方便地实现多线程运算,充分利用多核心 cpu 的性能。
众所周知服务器的处理器大都是单核频率较低而核心数较多,对于支持高并发的程序语言,可以充分利用服务器的多核优势,从而[详细] -
可缓存的 Go语言通路
所属栏目:[语言] 日期:2023-07-01 热度:6201
Go语言中有缓冲的通道(buffered channel)是一种在被接收前能存储一个或者多个值的通道。这种类型的通道并不强制要求 goroutine 之间必须同时完成发送和接收。通道会阻塞发送和接收动作的条件也会不同。只有在通道中[详细]
-
Go语言无缓冲区的传输通道
所属栏目:[语言] 日期:2023-07-01 热度:4958
Go语言中无缓冲的通道(unbuffered channel)是指在接收前没有能力保存任何值的通道。这种类型的通道要求发送 goroutine 和接收 goroutine 同时准备好,才能完成发送和接收操作。
如果两个 goroutine 没有同时准备[详细] -
Go语言单向通道在单向通道中的一种实现方式
所属栏目:[语言] 日期:2023-07-01 热度:7220
Go语言的类型系统提供了单方向的 channel 类型,顾名思义,单向 channel 就是只能用于写入或者只能用于读取数据。当然 channel 本身必然是同时支持读写的,否则根本没法用。
假如一个 channel 真的只能读取数据,[详细] -
Go语言通道(chan)——goroutine之间通讯渠道
所属栏目:[语言] 日期:2023-07-01 热度:7724
如果说 goroutine 是 Go语言程序的并发体的话,那么 channels 就是它们之间的通信机制。一个 channels 是一个通信机制,它可以让一个 goroutine 通过它给另一个 goroutine 发送值信息。每个 channel 都有一个特殊的类[详细]
-
goroutine与coroutine的区别
所属栏目:[语言] 日期:2023-07-01 热度:2784
C#、Lua、Python 语言都支持 coroutine 特性。coroutine 与 goroutine 在名字上类似,都可以将函数或者语句在独立的环境中运行,但是它们之间有两点不同:
goroutine 可能发生并行执行;
但 coroutine 始终顺序执行[详细] -
并发和并行的不同
所属栏目:[语言] 日期:2023-07-01 热度:7760
在讲解并发概念时,总会涉及另外一个概念并行。下面让我们来了解并发和并行之间的区别。
并发(concurrency):把任务在不同的时间点交给处理器进行处理。在同一时间点,任务并不会同时运行。
并行(parallelism[详细] -
Go语言 GoMAXPROCS(对并发运行的性能进行调整)
所属栏目:[语言] 日期:2023-07-01 热度:8187
在 Go语言程序运行时(runtime)实现了一个小型的任务调度器。这套调度器的工作原理类似于操作系统调度线程,Go 程序调度器可以高效地将 CPU 资源分配给每一个任务。传统逻辑中,开发者需要维护线程池中线程与 CPU 核[详细]
-
Go语言竞争状态概述
所属栏目:[语言] 日期:2023-07-01 热度:9450
有并发,就有资源竞争,如果两个或者多个 goroutine 在没有相互同步的情况下,访问某个共享的资源,比如同时对该资源进行读写时,就会处于相互竞争的状态,这就是并发中的资源竞争。
并发本身并不复杂,但是因为有[详细] -
可实现并发通信的 Go语言
所属栏目:[语言] 日期:2023-07-01 热度:7228
通过上一节《Go语言goroutine》的学习,关键字 go 的引入使得在Go语言中并发编程变得简单而优雅,但我们同时也应该意识到并发编程的原生复杂性,并时刻对并发中容易出现的问题保持警惕。
事实上,不管是什么平台,[详细] -
轻量级线程的 Go语言
所属栏目:[语言] 日期:2023-07-01 热度:8922
在编写 Socket 网络程序时,需要提前准备一个线程池为每一个 Socket 的收发包分配一个线程。开发人员需要在线程数量和 CPU 数量间建立一个对应关系,以保证每个任务能及时地被分配到 CPU 上进行处理,同时避免多个任[详细]
-
Go语言并发概览 (并发的作用)
所属栏目:[语言] 日期:2023-06-30 热度:4434
有人把Go语言比作 21 世纪的C语言,第一是因为Go语言设计简单,第二则是因为 21 世纪最重要的就是并发程序设计,而 Go 从语言层面就支持并发。同时实现了自动垃圾回收机制。
Go语言的并发机制运用起来非常简便,在[详细] -
Go语言go mod包依赖管理工具使用说明
所属栏目:[语言] 日期:2023-06-30 热度:4821
最早的时候,Go语言所依赖的所有的第三方库都放在 GOPATH 这个目录下面,这就导致了同一个库只能保存一个版本的代码。如果不同的项目依赖同一个第三方的库的不同版本,应该怎么解决?
go module 是Go语言从 1.11 [详细] -
Go语言flag包:命令行参数剖析
所属栏目:[语言] 日期:2023-06-30 热度:1497
在编写命令行程序(工具、server)时,我们有时需要对命令参数进行解析,各种编程语言一般都会提供解析命令行参数的方法或库,以方便程序员使用。在Go语言中的 flag 包中,提供了命令行参数解析的功能。
下面我们[详细] -
Go语言os包用法概述
所属栏目:[语言] 日期:2023-06-30 热度:1855
Go语言的 os 包中提供了操作系统函数的接口,是一个比较重要的包。顾名思义,os 包的作用主要是在服务器上进行系统的基本操作,如文件操作、目录操作、执行命令、信号与中断、进程、系统状态等等。
os 包中的常用函[详细] -
Go语言time包:时间与日期
所属栏目:[语言] 日期:2023-06-30 热度:6903
时间和日期是我们开发中经常会用到的,Go语言中的 time 包提供了时间显示和测量等所用的函数,本节我们就来介绍一下 time 包的基本用法。
time 包简介
时间一般包含时间值和时区,可以从Go语言中 time 包的源码中看[详细] -
Go语言规则表达式:规则包
所属栏目:[语言] 日期:2023-06-30 热度:918
正则表达式是一种进行模式匹配和文本操纵的复杂而又强大的工具。虽然正则表达式比纯粹的文本匹配效率低,但是它却更灵活,按照它的语法规则,根据需求构造出的正则表达式能够从原始文本中筛选出几乎任何你想要得到的[详细]
-
Go语言大包:对于整数的精度估计
所属栏目:[语言] 日期:2023-06-30 热度:6038
实际开发中,对于超出 int64 或者 uint64 类型的大数进行计算时,如果对精度没有要求,使用 float32 或者 float64 就可以胜任,但如果对精度有严格要求的时候,我们就不能使用浮点数了,因为浮点数在内存中只能被近似[详细]
-
Go语言sync包与锁:限定线程对变量的访问
所属栏目:[语言] 日期:2023-06-30 热度:6139
Go语言中 sync 包里提供了互斥锁 Mutex 和读写锁 RWMutex 用于处理并发过程中可能出现同时两个或多个协程(或线程)读或写同一个变量的情况。
为什么需要锁
锁是 sync 包中的核心,它主要有两个方法,分别是加锁([详细] -
使用其他代码在代码中使用 Go语言导入包
所属栏目:[语言] 日期:2023-06-30 热度:6208
可以在一个 Go语言源文件包声明语句之后,其它非导入声明语句之前,包含零到多个导入包声明语句。每个导入声明可以单独指定一个导入路径,也可以通过圆括号同时导入多个导入路径。要引用其他包的标识符,可以使用 im[详细]
