싱글 스레딩은 Go 언어의 기능이 아니며 Go 언어는 멀티 스레드입니다. Golang의 스레드 모델은 MPG 모델입니다. 전반적으로 Go 프로세스와 커널 스레드는 다대다 대응을 가지므로 Go는 다중 스레드 모드에 있어야 합니다. M과 커널 스레드는 1대 1에 대응하고 여러 G는 여러 M에 대응합니다. 이에 따라 P는 컨텍스트 리소스를 나타냅니다.
이 튜토리얼의 운영 환경: Windows 7 시스템, GO 버전 1.18, Dell G3 컴퓨터.
싱글 스레딩은 Go 언어의 기능이 아니며 Go 언어는 멀티 스레드입니다. 싱글쓰레드라면 아직도 쑥스럽네요. 멀티코어 시대에 높은 동시성을 위해 탄생한 언어라고요?
Golang의 스레드 모델은 MPG 모델입니다. 전체적으로 Go 프로세스와 커널 스레드는 다대다 대응을 가지므로 우선 멀티 스레드여야 합니다. 그 중 M은 커널 스레드 1:1에 해당하고, G는 다중 M에 해당합니다. P는 컨텍스트 리소스를 의미하므로 별로 말할 것도 없습니다. M(또는 커널 스레드) 수는 언제 증가합니까? 즉, 현재 M 개수로 현재 G를 모두 이동하도록 예약할 수 없는 경우 새 M을 사용하여 이를 처리합니다.
Go 동시성(멀티스레딩)
어떤 사람들은 Go를 21세기 C 언어와 비교합니다. 첫 번째는 Go 언어가 디자인이 단순하기 때문입니다. 두 번째는 21세기에 가장 중요한 것입니다. 병렬 프로그래밍이며 언어 수준에서 이동합니다. 이는 병렬성을 지원합니다.
goroutine은 Go 병렬 디자인의 핵심입니다. 최종 분석에서 고루틴은 실제로 스레드이지만 12개의 고루틴이 하단에 5~6개의 스레드에 반영될 수 있습니다. Go 언어는 이러한 고루틴 간의 메모리 공유를 실현하는 데 도움이 됩니다. 고루틴을 실행하는 데는 매우 적은 스택 메모리(약 4~5KB)가 필요하며 물론 해당 데이터에 따라 확장됩니다. 이로 인해 수천 개의 동시 작업을 동시에 실행할 수 있습니다. 고루틴은 스레드보다 사용하기 쉽고 효율적이며 가볍습니다.
Goroutine은 Go의 런타임으로 관리되는 스레드 관리자입니다. 고루틴은 실제로는 일반 함수인 go
키워드를 통해 구현됩니다. go
关键字实现了,其实就是一个普通的函数。
go hello(a, b, c)
通过关键字go就启动了一个goroutine。我们来看一个例子
package main import ( "fmt" "runtime" ) func say(s string) { for i := 0; i <p>我们可以看到go关键字很方便的就实现了并发编程。 上面的多个goroutine运行在同一个进程里面,共享内存数据,不过设计上我们要遵循:不要通过共享来通信,而要通过通信来共享。</p><blockquote> <p>runtime.Gosched()表示让CPU把时间片让给别人,下次某个时候继续恢复执行该goroutine。</p> <p>默认情况下,调度器仅使用单线程,也就是说只实现了并发。想要发挥多核处理器的并行,需要在我们的程序中显式调用 runtime.GOMAXPROCS(n) 告诉调度器同时使用多个线程。GOMAXPROCS 设置了同时运行逻辑代码的系统线程的最大数量,并返回之前的设置。如果n </p> </blockquote><p><a href="https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/02.7.md#channels" rel="external nofollow" target="_blank"></a><strong><span style="font-size: 18px;">channels</span></strong></p><p>goroutine运行在相同的地址空间,因此访问共享内存必须做好同步。那么goroutine之间如何进行数据的通信呢,Go提供了一个很好的通信机制channel。channel可以与Unix shell 中的双向管道做类比:可以通过它发送或者接收值。这些值只能是特定的类型:channel类型。定义一个channel时,也需要定义发送到channel的值的类型。注意,必须使用make 创建channel:</p><pre class="brush:php;toolbar:false">ci := make(chan int) cs := make(chan string) cf := make(chan interface{})
channel通过操作符<pre class="brush:php;toolbar:false">ch </pre>
package main import "fmt" func sum(a []int, c chan int) { total := 0 for _, v := range a { total += v } c go 키워드를 사용하면 동시 프로그래밍을 쉽게 구현하는 것을 볼 수 있습니다. 위의 여러 고루틴은 동일한 프로세스에서 실행되며 메모리 데이터를 공유합니다. 그러나 우리는 공유를 통해 통신하지 않고 통신을 통해 공유한다는 설계를 따라야 합니다. <p></p><p>runtime.Gosched()는 CPU가 타임 슬라이스를 다른 사람에게 포기하고 다음 번에 고루틴 실행을 계속 재개하도록 하는 것을 의미합니다. <a href="https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/02.7.md#buffered-channels" rel="external nofollow" target="_blank"></a>기본적으로 스케줄러는 단일 스레드만 사용하므로 동시성만 구현됩니다. 멀티 코어 프로세서의 병렬성을 활용하려면 프로그램에서 런타임.GOMAXPROCS(n)를 명시적으로 호출하여 스케줄러에게 동시에 여러 스레드를 사용하도록 지시해야 합니다. GOMAXPROCS는 논리 코드를 동시에 실행할 수 있는 최대 시스템 스레드 수를 설정하고 이전 설정을 반환합니다. n <span style="font-size: 18px;"></span><a href="https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/02.7.md#channels" rel="외부 nofollow" target="_blank "></a></p><p>channels</p>🎜🎜🎜goroutine은 동일한 주소 공간에서 실행되므로 공유 메모리에 대한 액세스가 동기화되어야 합니다. 그렇다면 고루틴 간에 데이터를 통신하는 방법은 무엇입니까? Go는 좋은 통신 메커니즘 채널을 제공합니다. 채널은 Unix 셸의 양방향 파이프와 비교할 수 있습니다. 채널을 통해 값을 보내거나 받을 수 있습니다. 이 값은 특정 유형, 즉 채널 유형만 될 수 있습니다. 채널을 정의할 때 채널로 전송되는 값의 유형도 정의해야 합니다. 채널은 make를 사용하여 생성되어야 합니다. 🎜<pre class="brush:php;toolbar:false">ch := make(chan type, value) value == 0 ! 无缓冲(阻塞) value > 0 ! 缓冲(非阻塞,直到value 个元素)🎜채널은
연산자를 통해 데이터를 수신하고 보냅니다. 🎜<pre class="brush:php;toolbar:false">package main
import "fmt"
func main() {
c := make(chan int, 2)//修改2为1就报错,修改2为3可以正常运行
c 🎜다음 예를 적용합니다. 🎜<pre class="brush:php;toolbar:false">package main
import (
"fmt"
)
func fibonacci(n int, c chan int) {
x, y := 1, 1
for i := 0; i 🎜기본적으로 채널은 반대쪽 끝이 준비되지 않은 한 데이터를 주고받을 때 차단되므로 명시적인 잠금 없이도 고루틴 동기화가 더 쉬워집니다. 소위 차단이란 (값 := ch := make(chan type, value)
value == 0 ! 无缓冲(阻塞)
value > 0 ! 缓冲(非阻塞,直到value 个元素)</pre><p>我们看一下下面这个例子,你可以在自己本机测试一下,修改相应的value值</p><pre class="brush:php;toolbar:false">package main
import "fmt"
func main() {
c := make(chan int, 2)//修改2为1就报错,修改2为3可以正常运行
c <p><a href="https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/02.7.md#range%E5%92%8Cclose" rel="external nofollow" target="_blank"></a><strong><span style="font-size: 18px;">Range和Close</span></strong></p><p>上面这个例子中,我们需要读取两次c,这样不是很方便,Go考虑到了这一点,所以也可以通过range,像操作slice或者map一样操作缓存类型的channel,请看下面的例子</p><pre class="brush:php;toolbar:false">package main
import (
"fmt"
)
func fibonacci(n int, c chan int) {
x, y := 1, 1
for i := 0; i <p><code>for i := range c</code>能够不断的读取channel里面的数据,直到该channel被显式的关闭。上面代码我们看到可以显式的关闭channel,生产者通过内置函数<code>close</code>关闭channel。关闭channel之后就无法再发送任何数据了,在消费方可以通过语法<code>v, ok := 测试channel是否被关闭。如果ok返回false,那么说明channel已经没有任何数据并且已经被关闭。</code></p><blockquote>
<p>记住应该在生产者的地方关闭channel,而不是消费的地方去关闭它,这样容易引起panic</p>
<p>另外记住一点的就是channel不像文件之类的,不需要经常去关闭,只有当你确实没有任何发送数据了,或者你想显式的结束range循环之类的</p>
</blockquote><p><a href="https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/02.7.md#select" rel="external nofollow" target="_blank"></a><strong><span style="font-size: 18px;">Select</span></strong></p><p>我们上面介绍的都是只有一个channel的情况,那么如果存在多个channel的时候,我们该如何操作呢,Go里面提供了一个关键字<code>select</code>,通过<code>select</code>可以监听channel上的数据流动。</p><p><code>select</code>默认是阻塞的,只有当监听的channel中有发送或接收可以进行时才会运行,当多个channel都准备好的时候,select是随机的选择一个执行的。</p><pre class="brush:php;toolbar:false">package main
import "fmt"
func fibonacci(c, quit chan int) {
x, y := 1, 1
for {
select {
case c <p>在<code>select</code>里面还有default语法,<code>select</code>其实就是类似switch的功能,default就是当监听的channel都没有准备好的时候,默认执行的(select不再阻塞等待channel)。</p><pre class="brush:php;toolbar:false">select {
case i := <p><a href="https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/02.7.md#%E8%B6%85%E6%97%B6" rel="external nofollow" target="_blank"></a><strong><span style="font-size: 18px;">超时</span></strong></p><p>有时候会出现goroutine阻塞的情况,那么我们如何避免整个程序进入阻塞的情况呢?我们可以利用select来设置超时,通过如下的方式实现:</p><pre class="brush:php;toolbar:false">func main() {
c := make(chan int)
o := make(chan bool)
go func() {
for {
select {
case v := <p><a href="https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/02.7.md#runtime-goroutine" rel="external nofollow" target="_blank"></a><strong><span style="font-size: 18px;">runtime goroutine</span></strong></p><p>runtime包中有几个处理goroutine的函数:</p></pre></pre></pre></pre></pre></pre>
<ul>
<li>
<p>Goexit</p>
<p>退出当前执行的goroutine,但是defer函数还会继续调用</p>
</li>
<li>
<p>Gosched</p>
<p>让出当前goroutine的执行权限,调度器安排其他等待的任务运行,并在下次某个时候从该位置恢复执行。</p>
</li>
<li>
<p>NumCPU</p>
<p>返回 CPU 核数量</p>
</li>
<li>
<p>NumGoroutine</p>
<p>返回正在执行和排队的任务总数</p>
</li>
<li>
<p>GOMAXPROCS</p>
<p>用来设置可以并行计算的CPU核数的最大值,并返回之前的值。</p>
</li>
</ul>
<p>【相关推荐:<a href="http://www.php.cn/course/list/44.html" target="_blank">Go视频教程</a>、<a href="https://www.php.cn/course.html" target="_blank" textvalue="编程教学">编程教学</a>】</p>
위 내용은 단일 스레딩은 Go 언어의 기능인가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

goisidealforbuildingscalablesystemsduetoitssimplicity, 효율성 및 빌드-내부 컨 컨 오렌 스upport.1) go'scleansyntaxandminimalisticdesignenenhance-reductivityandreduceerrors.2) itsgoroutinesandChannelsableefficedsoncurrentProgramming, DistributingLoa

initTectionsIntOnaUtomaticallyBeforemain () andAreSefulforsettingupenvirondentAnitializingVariables.usethemforsimpletasks, propoysideeffects 및 withtestingntestingandloggingtomaincodeclarityAndestability.

goinitializespackages는 theyareimported, theexecutesinitfunctions, theneiredefinitionorder, andfilenamesDeterMineDeTerMineTeRacrossMultipleFiles.ThemayLeadTocomplexInitializations의 의존성 의존성의 의존성을 확인합니다

CustomInterfacesingoAreCrucialForwritingFlectible, 관리 가능 및 TestAblEcode.theyenabledeveloperstofocusonBehaviorimplementation, 향상 ModularityAndRobustness

시뮬레이션 및 테스트에 인터페이스를 사용하는 이유는 인터페이스가 구현을 지정하지 않고 계약의 정의를 허용하여 테스트를보다 고립되고 유지 관리하기 쉽기 때문입니다. 1) 인터페이스를 암시 적으로 구현하면 테스트에서 실제 구현을 대체 할 수있는 모의 개체를 간단하게 만들 수 있습니다. 2) 인터페이스를 사용하면 단위 테스트에서 서비스의 실제 구현을 쉽게 대체하여 테스트 복잡성과 시간을 줄일 수 있습니다. 3) 인터페이스가 제공하는 유연성은 다른 테스트 사례에 대한 시뮬레이션 동작의 변화를 허용합니다. 4) 인터페이스는 처음부터 테스트 가능한 코드를 설계하여 코드의 모듈성과 유지 관리를 향상시키는 데 도움이됩니다.

GO에서는 INT 기능이 패키지 초기화에 사용됩니다. 1) INT 기능은 패키지 초기화시 자동으로 호출되며 글로벌 변수 초기화, 연결 설정 및 구성 파일로드에 적합합니다. 2) 파일 순서로 실행할 수있는 여러 개의 초기 함수가있을 수 있습니다. 3)이를 사용할 때 실행 순서, 테스트 난이도 및 성능 영향을 고려해야합니다. 4) 부작용을 줄이고, 종속성 주입을 사용하고, 초기화를 지연하여 초기 기능의 사용을 최적화하는 것이 좋습니다.

go'selectStatementsTreamLinesconcurramprogrammingBymultiplexingOperations.1) ItallowSwaitingOnMultipLechannelOperations, executingThefirStreadYone.2) thedefaultCasePreventsDeadLocksHavingThepRamToproCeedifNooperationSready.3) Itcanusedfored

Contextandwaitgroupsarecrucialingformaninggoroutineeseforoutineeseferfectial


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

Dreamweaver Mac版
시각적 웹 개발 도구

VSCode Windows 64비트 다운로드
Microsoft에서 출시한 강력한 무료 IDE 편집기

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

안전한 시험 브라우저
안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

드림위버 CS6
시각적 웹 개발 도구
