Go 언어, concurrency를 위해 특별히 설계된 언어입니다. microthread를 시작할 때마다 하나는 대략 2KB2KB
起步
假设一个内存条大小4G,一个微线程2kb,1G=1024M=1048576kb
,1048576/2=524288
,五十多万个
但是你知道像Java,Python等语言,一个线程代价多大吗???,2MB
起步,代价直接翻了千倍
所以,激动吧,随便用Go写一个web程序,基本都相当于Nginx
시작하기
🎜메모리 스틱 크기 가정🎜🎜🎜4G🎜🎜🎜, 마이크로 스레드🎜🎜 🎜2kb🎜🎜🎜, 🎜🎜1G=1024M=1048576kb
🎜🎜, 🎜🎜1048576/2= 524288
🎜🎜, 50만 개 이상 🎜🎜
🎜하지만 Java, Python 및 기타 언어와 같은 언어의 스레드 비용이 얼마나 되는지 아시나요???,🎜🎜2MB
🎜🎜시작하면 가격이 1000배로 두 배로 올랐어요🎜🎜
🎜자, Go로 웹 프로그램을 작성해 보세요. 기본적으로 🎜와 같습니다. 🎜Nginx
🎜🎜
<br>
<br>
Go中的微线程,也叫做goroutine
,goroutine
是并行处理任务的
就像我用两只手同时操作两个手机打游戏一样
而不是一个手玩玩这个,一个手玩玩那个,这样切换式玩法
goroutine
由Go的runtime
完成调度,goroutine
goroutine
고루틴
고루틴
🎜🎜是并行处理任务的🎜🎜🎜就image我两只手同时操作两个手机打游戏一样🎜🎜
🎜而不是一个手玩玩这个,一个手玩玩那个,这样切换式玩法🎜🎜
🎜고루틴
🎜🎜由Go的🎜🎜런타임
🎜🎜完成调島,🎜🎜고루틴
🎜🎜적본质是재대码(용户态)级别完成的切换,代价很小🎜🎜🎜🎜이미지 Java, Python等语言的线程, 是以代价不常大🎜🎜
고루틴
goroutine
是由runtime
完成切换,并且runtime
经过Google公司的数位大佬优化,已经很小母牛上山了,牛逼哄哄了。
<br>
在Go中使用goroutine
很简单,只需要在想调用的函数前加一个go就行了,这就代表启动了一个goroutine
예
런타임
🎜🎜완전한 전환 , 그리고 🎜🎜런타임
🎜🎜Google 제공 디지털 마스터가 최적화한 작은 소가 산에 올라갔는데 정말 대단해요. 🎜🎜🎜🎜<br>🎜🎜🎜Go에서 사용🎜🎜 10번 반복했는데 10초가 걸렸습니다. 느린! 함수는 여전히 위의 함수입니다 참고: 6번째 줄에 go in을 추가하세요. front 키워드인 go 키워드는 이 함수를 마이크로 스레드에서 별도로 실행하는 것을 의미합니다. 무슨일이야??? Go에서는 데몬 스레드 방식을 사용하기 때문입니다. Go에서는 주요 기능이 실행되는 한 다른 마이크로 스레드는 유휴 상태입니다. 일부 몬스터들처럼 서로서로, 그리고 엄마의 몸에 의존하고 있습니다. 엄마의 몸이 죽으면 아래의 아기도 죽습니다. 이 문제를 해결하는 방법은??? 위에서 언급했듯이 일부 마이크로 스레드가 시작되었지만 마이크로 스레드가 이전에 종료된 것을 발견했습니다. main 함수 가 너무 빠르게 실행되고 main 실행이 완료되고 Go 런타임이 자동으로 다른 마이크로 스레드를 닫았기 때문입니다. 그럼 생각해보세요. 어떻게 하면 마지막에 메인잠깐만요, 아이들이 돌아오면 계속 달릴 거에요. 所以,有一个新的问题,那就是等,祭出法宝 先看一下怎么用 可以看到,10个线程同时启动,1s就完了,并且代码相对简单,就算开启10w个,还是1s多一点 这也是为什么很多公司越来越青睐Go的原因。 这个意思要使用多少个核,默认使用全部核心,性能跑满,但是也有意外的情况, 比如一个机器跑了很多其他任务,Go写的这个是不太重要的任务,但是是计算型的,这时候理论来说是不尽量挤兑别人的算力 所以要限制一下当前程序使用电脑的算力 代码 <br> 上述我们学习了Go的并发,学习了 如何创建一个协程(goroutine)。 为什么需要 设置当前程序使用CPU核数。goroutine
🎜🎜은 매우 간단합니다. 원할 때만 호출하면 됩니다 🎜 함수 앞에 go만 추가하세요🎜🎜. 즉, 🎜🎜고루틴
🎜🎜일반 호출 함수 방식
Function
func Say() {
time.Sleep(time.Second)
fmt.Println("我在说话说了1s说完了...")
}
main
func main() {
//开始时间
var start_time = time.Now()
//启动10个say说话
for i := 0; i < 10; i++ {
Say()
}
//结束时间
var end_time = time.Now()
//计算时间差
fmt.Println(end_time.Sub(start_time))
}
실행 결과
고루틴 함수 호출 방법
main
func main() {
//开始时间
var start_time = time.Now()
//启动10个say说话
for i := 0; i < 10; i++ {
go Say()
}
//结束时间
var end_time = time.Now()
//计算时间差
fmt.Println(end_time.Sub(start_time))
}
실행 결과
왜 이런 0의 상황이 발생하는 걸까요
sync.WaitGroup
sync.WaitGroup
函数
func Say() {
//函数结束时取消标记
defer wg.Done()
//每个函数在启动时加上一个标记
wg.Add(1)
//函数开始打上一个标记
time.Sleep(time.Second*1)
fmt.Println("我在说话说了1s说完了...")
}
main
var wg sync.WaitGroup
func main() {
//开始时间
var start_time = time.Now()
//启动10个say说话
for i := 0; i < 10; i++ {
go Say()
}
// 等待所有标记过的微线程执行完毕
wg.Wait()
//结束时间
var end_time = time.Now()
//计算时间差
fmt.Println(end_time.Sub(start_time))
}
执行结果
runtime.GOMAXPROCS
func main() {
//本机的cpu个数
var cpuNum = runtime.NumCPU()
fmt.Println(cpuNum)
//设置Go使用cpu个数
runtime.GOMAXPROCS(4)
}
总结<br>
sync.WaitGroup
。
위 내용은 Go 언어 동시성의 기본을 소개하는 기사의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!