Skip to content

Commit

Permalink
Site updated: 2023-10-10 00:17:03
Browse files Browse the repository at this point in the history
  • Loading branch information
Cidyerlia committed Oct 9, 2023
1 parent f448d57 commit 0d1f4a8
Show file tree
Hide file tree
Showing 2 changed files with 5 additions and 3 deletions.
6 changes: 4 additions & 2 deletions 2023/10/09/Go1-2/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
<meta property="og:image" content="https://cidyerlia.github.io/2023/10/09/Go1-2/fig4.png">
<meta property="og:image" content="https://cidyerlia.github.io/2023/10/09/Go1-2/fig5.jpg">
<meta property="article:published_time" content="2023-10-09T15:23:49.000Z">
<meta property="article:modified_time" content="2023-10-09T15:52:02.000Z">
<meta property="article:modified_time" content="2023-10-09T16:16:54.000Z">
<meta property="article:author" content="Jiamu">
<meta property="article:tag" content="原创">
<meta name="twitter:card" content="summary_large_image">
Expand Down Expand Up @@ -387,7 +387,9 @@ <h2 id="Goroutine🤔"><a href="#Goroutine🤔" class="headerlink" title="Gorout
<li>高并发:利用Goroutine可以轻易地编写高并发程序,一个服务器程序可以同时接待成千上万个客户端。</li>
<li>Channel通信:Goroutine之间可以通过Channel进行高效的消息通信与同步,这使得编写并发程序变得简单。</li>
</ol>
<h3 id="创建Goroutine的语法"><a href="#创建Goroutine的语法" class="headerlink" title="创建Goroutine的语法"></a>创建Goroutine的语法</h3><figure class="highlight go"><figcaption><span>func()&#123;&#125;()```:第一个`func() &#123;...&#125; `定义了一个匿名函数(anonymous function)。第二个`()`代表调用这个匿名函数。</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><code class="hljs go"><br><span class="hljs-string">``</span><span class="hljs-string">`go</span><br><span class="hljs-string">package main</span><br><span class="hljs-string"></span><br><span class="hljs-string">import (</span><br><span class="hljs-string"> &quot;fmt&quot;</span><br><span class="hljs-string"> &quot;time&quot;</span><br><span class="hljs-string">)</span><br><span class="hljs-string"></span><br><span class="hljs-string">func main() &#123;</span><br><span class="hljs-string"> // 创建一个Goroutine</span><br><span class="hljs-string"> go func() &#123;</span><br><span class="hljs-string"> fmt.Println(&quot;Hello from Goroutine!&quot;)</span><br><span class="hljs-string"> &#125;()</span><br><span class="hljs-string"></span><br><span class="hljs-string"> time.Sleep(1)</span><br><span class="hljs-string"> // 主Goroutine</span><br><span class="hljs-string"> fmt.Println(&quot;Hello from main!&quot;)</span><br><span class="hljs-string">&#125;</span><br></code></pre></td></tr></table></figure>
<h3 id="创建Goroutine的语法"><a href="#创建Goroutine的语法" class="headerlink" title="创建Goroutine的语法"></a>创建Goroutine的语法</h3><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs go"><span class="hljs-function"><span class="hljs-keyword">func</span><span class="hljs-params">()</span></span>&#123;&#125;()<span class="hljs-string">``</span><span class="hljs-string">`:第一个`</span><span class="hljs-function"><span class="hljs-keyword">func</span><span class="hljs-params">()</span></span> &#123;...&#125; <span class="hljs-string">`定义了一个匿名函数(anonymous function)。第二个`</span>()<span class="hljs-string">`代表调用这个匿名函数。</span><br></code></pre></td></tr></table></figure>

<figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><code class="hljs go"><span class="hljs-keyword">package</span> main<br><br><span class="hljs-keyword">import</span> (<br> <span class="hljs-string">&quot;fmt&quot;</span><br> <span class="hljs-string">&quot;time&quot;</span><br>)<br><br><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">main</span><span class="hljs-params">()</span></span> &#123;<br> <span class="hljs-comment">// 创建一个Goroutine</span><br> <span class="hljs-keyword">go</span> <span class="hljs-function"><span class="hljs-keyword">func</span><span class="hljs-params">()</span></span> &#123;<br> fmt.Println(<span class="hljs-string">&quot;Hello from Goroutine!&quot;</span>)<br> &#125;()<br><br> time.Sleep(<span class="hljs-number">1</span>)<br> <span class="hljs-comment">// 主Goroutine</span><br> fmt.Println(<span class="hljs-string">&quot;Hello from main!&quot;</span>)<br>&#125;<br></code></pre></td></tr></table></figure>

<h3 id="Goroutine的调度与上下文切换"><a href="#Goroutine的调度与上下文切换" class="headerlink" title="Goroutine的调度与上下文切换"></a>Goroutine的调度与上下文切换</h3><p>为了让不同的Goroutine有机会运行,runtime会在Goroutine之间进行上下文切换。当一个Goroutine运行一定时间或遇到channel操作时,会主动交出线程的执行权,这时runtime会从其他挂起的Goroutine中选择一个继续运行。上下文切换涉及到保存当前运行Goroutine的程序计数器、堆栈指针等上下文信息,并恢复下一个要运行的Goroutine的上下文信息,这个过程需要一定的时间开销。</p>
<h3 id="Goroutine存在的内存问题及解决方案"><a href="#Goroutine存在的内存问题及解决方案" class="headerlink" title="Goroutine存在的内存问题及解决方案"></a>Goroutine存在的内存问题及解决方案</h3><p>存在的问题:</p>
Expand Down
Loading

0 comments on commit 0d1f4a8

Please sign in to comment.