go语言之反射

论坛 期权论坛     
选择匿名的用户   2021-5-22 22:24   24   0
<div class="blogpost-body" id="cnblogs_post_body">
<p>---恢复内容开始---</p>
<p><strong><span style="font-size:18pt;">一 :并发基础</span></strong></p>
<p>1 并发和并行</p>
<div class="cnblogs_code">
  <pre class="blockcode"><span style="color:#000000;">并发和并行是两个不同的概念:
</span><span style="color:#800080;">1</span><span style="color:#000000;"> 并行意味着程序在任意时刻都是同时运行的:
</span><span style="color:#800080;">2</span> 并发意味着程序在单位时间内是同时运行的</pre>
</div>
<div class="cnblogs_code">
  <pre class="blockcode"><span style="color:#000000;">详解:
  并行就是在任一粒度的时间内都具备同时执行的能力:最简单的并行就是多机,多台机器
并行处理;SMP 表面上看是并行的,但由于是共享内存,以及线程间的同步等,不可能完全做
到并行
  并发是在规定的时间内多个请求都得到执行和处理,强调的是给外界的感觉,实际上内部
可能是分时操作的 。并发重在避免阻塞,使程序不会因为 个阻 而停止处理。并发典型的应
用场景:分时操作系统就是一种并发设计(忽略多核 CPU )。
  并行是硬件和操作系统开发者重点考虑的问题,作为应用层的程序员,唯一可以选择的就
是充分借助操作系统提供的 API 和程序语言特性,结合实际需求设计出具有良好并发结构的程
序,提升程序的并发处理能力。现代操作系统能够提供的最基础的并发模型就是多线程和多进
程;编程语言这一层级可以进一步封装来提升程序的井发处理能力。
  在当前的计算机体系下:并行具有瞬时性,并发具有过程性;并发在于结构,井行在于执
行。应用程序具备好的并发结构,操作系统才能更好地利用硬件并行执行,同时避免阻塞等待,
合理地进行调度,提升 CPU 利用率。应用层程序员提升程序并发处理能力的一个重要手段就是
为程序设计良好的并发结构。</span></pre>
</div>
<p>2 go语言之并发</p>
<div class="cnblogs_code">
  <pre class="blockcode"> go从语言层面就支持了并发,简化了并发程序的编写</pre>
</div>
<p>3 goroutine 是什么</p>
<div class="cnblogs_code">
  <pre class="blockcode"><span style="color:#800080;">1</span><span style="color:#000000;"> 它是go并发设计的核心
</span><span style="color:#800080;">2</span><span style="color:#000000;"> goroutine就是协程,它比线程更小,十几个goroutine在底层可能就是五六个线程
</span><span style="color:#800080;">3</span> go语言内部实现了goroutine的内存共享,执行goroutine只需极少的栈内存(大概是4~5KB)</pre>
</div>
<p>4 创建goroutine</p>
<div class="cnblogs_code">
  <pre class="blockcode"><span style="color:#800080;">1</span><span style="color:#000000;"> 只需要在语句前添加go关键字,就可以创建并发执行单元
</span><span style="color:#800080;">2</span> 开发员无需了解任何执细节,调度器会自动将其安排到合适的系统线程上执行</pre>
</div>
<div class="cnblogs_code">
  <pre class="blockcode"><span style="color:#000000;">package main

import (
   </span><span style="color:#800000;">&#34;</span><span style="color:#800000;">fmt</span><span style="color:#800000;">&#34;</span>
   <span style="color:#800000;">&#34;</span><span style="color:#800000;">time</span><span style="color:#800000;">&#34;</span><span style="color:#000000;">
)

</span><span style="color:#008000;">//</span><span style="color:#008000;">子协程</span>
<span style="color:#000000;">func newTask() {
   i :</span>&#61; <span style="color:#800080;">0</span>
   <span style="color:#0000ff;">for</span><span style="color:#000000;"> {
      i</span>&#43;&#43;<span style="color:#000000;">
      fmt.Printf(</span><span style="color:#800000;">&#34;</span><span style="color:#800000;">new goroutin:i&#61;%d\n</span><span style="color:#800000;">&#34;</span><span style="color:#000000;">, i)
      time.Sleep(</span><span style="color:#800080;">1</span> *<span style="color:#000000;"> time.Second)
   }
}

func main() {
   </span><span style="color:#008000;">//</span><span style="color:#008000;">启动子协程</span>
<span style="color:#000000;">   go newTask()
   i :</span>&#61; <span style="color:#800080;">0</span>
   <span style="color:#0000ff;">for</span><span style="color:#000000;"> {
      i</span>&#43;&#43;<span style="color:#000000;">
      fmt.Printf(</span><span style="color:#800000;">&#34;</span><span style="color:#800000;">main goroutin:i&#61;%d\n</span><span style="color:#800000;">&#34;</span><span style="color:#000000;">, i)
      time.Sleep(</span><span style="color:#800080;">1</span> *<span style="color:#000000;"> time.Second)
   }
}</span></pre>
</div>
<p>  主线程退出 其他任务就不会执行了</p>
<div class="cnblogs_code">
  <pre class="blockcode"><span style="color:#000000;">package main

import (
   </span><span style="color:#800000;">&#34;</span><span style="color:#800000;">fmt</span><span style="color:#800
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP