Skip to content

Commit

Permalink
update blog
Browse files Browse the repository at this point in the history
  • Loading branch information
BryceWin11Ubuntu authored and BryceWin11Ubuntu committed May 26, 2024
1 parent 9c0471a commit 84ff7aa
Showing 1 changed file with 15 additions and 6 deletions.
21 changes: 15 additions & 6 deletions async-and-multithread-programming-1-async.html
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ <h2>content</h2>
c. 使用多线程的目标是什么?</li>
<li>其他语言的多线程编程</li>
<li>多线程与异步编程的关系 (主要讲GoRotine,分析源码,看一下rust有没有改进)</li>
<li>GPU并行编程 </li>
<li>GPU并行编程</li>
</ol>
<h2>introduction</h2>
<h3>background</h3>
Expand All @@ -157,9 +157,9 @@ <h3>in this article</h3>
<h2>什么是异步编程?</h2>
<p>异步的反面是同步编程。
同步编程:(注意:同步:我得在邮局等待)(TODO:换成流程图)
我去邮局寄一个邮件去我朋友家-&gt;邮局发邮件去朋友家-&gt;朋友回复邮件-&gt;邮局收到回复的邮件-&gt;我拿到邮件-&gt;把回复邮件中的Cheque存到银行-&gt;回家吃饭
我去邮局寄借钱邮件去我朋友家-&gt;邮局发邮件去朋友家-&gt;朋友回复邮件-&gt;邮局收到回复的邮件-&gt;我拿到邮件-&gt;把回复邮件中的Cheque存到银行-&gt;回家吃饭
异步编程:
我去邮局寄一个邮件去我朋友家-&gt;回家吃饭-&gt;做点其他的事情 ... 我拿到邮件-&gt;把回复邮件中的Cheque存到银行
我去邮局寄借钱邮件去我朋友家-&gt;回家吃饭-&gt;做点其他的事情 ... 我拿到邮件-&gt;把回复邮件中的Cheque存到银行
| |
-&gt;邮局发邮件去朋友家-&gt;朋友回复邮件-&gt;邮局收到回复的邮件-&gt;</p>
<p>TODO:流程图 (链接到github)
Expand All @@ -173,13 +173,22 @@ <h2>什么是异步编程?</h2>
<p>对于计算机来讲,主要是让主线程利用所有的空闲时间去做其他的事情,这样可以充分发利用主线程的计算资源。</p>
<p>对于 JavaScript 来说,主线程(Main Thread)就是 UI 线程(UI Thread)。这意味着 JavaScript 负责执行所有的代码,同时还要处理用户界面(UI)的渲染和用户交互事件(如点击按钮、输入等)。如果主线程被长时间占用或阻塞,就会导致用户界面无法及时响应用户的交互请求,用户界面会进入无响应状态。</p>
<p>JavaScript 设计之初就是为了在浏览器中执行,以实现动态网页交互。为了避免用户界面频繁处于无响应状态,JavaScript 语言及其运行环境(浏览器)引入了一系列机制来处理异步操作。这些机制允许长时间运行的任务和 I/O 操作(如网络请求、文件读取等)不会阻塞主线程,从而确保用户界面始终保持响应。这也是我为什么用JavaScript来做实验的原因,当然我这里为了方便用了Node.js来做javascript的runtime。</p>
<p>比如:JavaScript请求一个REST API(HTTP): Mail, 需要反应个2s,如果是同步在这2s内,应用点击UI是没有响应的,因为主线程在这2s内的任务是等待Mail的返回,无法做其他的事情。但如果是异步,这2s内主线程是空闲的,完全可以处理用户的任何请求,而不会出现UI无响应的情况。</p>
<p>那如果在这2s内,如:1.2秒,Mail突然返回了数据,会打断其他的任务吗?不会。因为1.2接受到Mail的返回时JavaScript会把Mail的回调函数插入事件循环,等待当前任务执行完毕后才会从<strong>事件循环</strong>中取出Mail的<strong>回调函数</strong>并执行相应的处理任务。</p>
<p>比如:JavaScript请求一个REST API(HTTP): Mail, 需要等待2s才能回复数据。
如果是同步:在这2s内,应用点击UI是没有响应的,因为主线程在这2s内的任务是等待Mail的返回,无法做其他的事情。
如果是异步:这2s内主线程是空闲的,完全可以处理用户的任何请求,而不会出现UI无响应的情况。那如果在这2s内,如:1.2秒,Mail突然返回了数据,会打断其他的任务吗?不会。因为1.2后接受到Mail的返回时JavaScript会把Mail的回调函数插入事件循环,等待当前任务执行完毕后才会从<strong>事件循环</strong>中取出Mail的<strong>回调函数</strong>并执行相应的处理任务。</p>
<h2>JavaScript中的异步编程</h2>
<p>我们刚刚碰到了两个新的名词:事件循环和回调函数。我们来解释一下JavaScript中是怎么用他们来实现异步编程的。</p>
<h3>回调函数</h3>
<p>TODO:再贴一下时序图</p>
<p>图中所示,</p>
<p>图中所示,“把回复邮件中的Cheque存到银行”就是回调函数,因为只有等待朋友把包含cheque的邮件寄回来了才可以执行,而且回调函数的调用方应该是邮局,因为它能精准的知道回复邮件什么时候到。</p>
<p>TODO:展示一下代码</p>
<h3>事件循环</h3>
<p>TODO: 流程图</p>
<p>TODO: node.js的示例 (链接到github)</p>
<p>TODO: 讲解一下代码(队列,先进先出)</p>
<p>TODO: 用event loop实现mail demo (链接到github)</p>
<p>TODO: 并简单的讲解</p>
<p>TODO: 展示 nodejs和V8的事件循环的源码</p>
<p># relative resources</p>
<p><a href="https://x.com/DrJimFan/status/1791514371086250291">GPU programming from Jim Fan</a></p>
</div>
Expand Down

0 comments on commit 84ff7aa

Please sign in to comment.