文章目录
1 协程
协程不是由操作系统提供,由程序员人为提供(用户态上下文切换技术)
协称(Coroutine),也可以被称为微线程,是一种用户态内的上下文切换技术。简而言之,其实就是通过一个线程实现代码块相互切换执行。
实现协程的几种方法:
- greenlet、早期模块
- yield关键字
- asynco装饰器(py3.4)
- async、await关键字(py3.5)(推荐)
协程意义
在一个线程中,如果遇到IO等待时间,线程不会等,利用空闲的时间在去干其他事。
2 异步编程
3.1 事件循环
理解微一个死循环,去检测并执行某些代码
import asyncio
loop = asyncio.get_event_loop()
loop.run_until_complete(任务)
3.2 async
协程函数:定义函数的时候async def 函数名
协程对象:执行协程函数()得到协程对象
async def func():
pass
result = func()
注意:执行协程函数创建爱协程对象,函数内部代码不会执行
事件循环处理函数内部代码
import asyncio
async def func():
pass
result = func()
asycio.run(result)
3.3 await
await + 可等待对象(协程对象、Future、Task)
await就是等待对象的值得到结果之后在继续往下走
案例一:
import asyncio
async def func():
print("666")
res = await asyncio.sleep(2)
print("结束", res)
asyncio.run(func())
案例二:
import asyncio
async def others():
print("start")
await asyncio.sleep(2)
print("end")
return "返回值"
async def func():
print("执行协程函数内部代码")
res = await others()
print("IO请求结束,结果为:", res)
asyncio.run(func())
案例三
import asyncio
async def others():
print("start")
await asyncio.sleep(2)
print("end")
return "返回值"
async def func():
print("执行协程函数内部代码")
res1 = await others()
print("IO请求结束,结果为:", res1)
res2 = await others()
print("IO请求结束,结果为:", res2)
asyncio.run(func())
3.4 Task对象
参考地址:
https://www.bilibili.com/video/BV1dD4y127bD
<p><h3>文章目录</h3><ul><ul><li><a href="#1__2">1 协程</a></li><li><a href="#2__18">2 异步编程</a></li><ul><li><a href="#31__19">3.1 事件循环</a></li><li><a href="#32_async_32">3.2 async</a></li><li><a href="#33_await_65">3.3 await</a></li><li><a href="#34_Task_128">3.4 Task对象</a></li></ul></ul></ul></p>
<h2><a id="1__2"></a>1 协程</h2>
<p>协程不是由操作系统提供,由程序员人为提供(用户态上下文切换技术)</p>
<p>协称(Coroutine),也可以被称为微线程,是一种用户态内的上下文切换技术。简而言之,其实就是通过一个线程实现代码块相互切换执行。</p>
<p>实现协程的几种方法:</p>
<ul>
<li>greenlet、早期模块</li>
<li>yield关键字</li>
<li>asynco装饰器(py3.4)</li>
<li>async、await关键字(py3.5)(推荐)</li>
</ul>
<p><strong>协程意义</strong><br />
在一个线程中,如果遇到IO等待时间,线程不会等,利用空闲的时间在去干其他事。</p>
<h2><a id="2__18"></a>2 异步编程</h2>
<h3><a id="31__19"></a>3.1 事件循环</h3>
<p>理解微一个死循环,去检测并执行某些代码</p>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-keyword">import</span> asyncio
<span class="hljs-comment"># 生成或获取一个事件循环</span>
loop = asyncio.get_event_loop()
<span class="hljs-comment"># 将任务放到 任务列表</span>
loop.run_until_complete(任务)
</code></div></pre>
<h3><a id="32_async_32"></a>3.2 async</h3>
<p>协程函数:定义函数的时候<code>async def 函数名</code><br />
协程对象:执行协程函数()得到协程对象</p>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-comment"># 协程对象</span>
<span class="hljs-keyword">async</span> <span class="hljs-keyword">def</span> <span class="hljs-title function_">func</span>():
<span class="hljs-keyword">pass</span> <span class="hljs-comment"># 内容不执行</span>
<span class="hljs-comment"># 协程对象</span>
result = func()
</code></div></pre>
<p>注意:执行协程函数创建爱协程对象,函数内部代码不会执行</p>
<p>事件循环处理函数内部代码</p>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-keyword">import</span> asyncio
<span class="hljs-comment"># 协程对象</span>
<span class="hljs-keyword">async</span> <span class="hljs-keyword">def</span> <span class="hljs-title function_">func</span>():
<span class="hljs-keyword">pass</span> <span class="hljs-comment"># 内容不执行</span>
<span class="hljs-comment"># 协程对象</span>
result = func()
<span class="hljs-comment"># 添加事件,帮助执行函数内部代码 py3.4</span>
<span class="hljs-comment">#loop = asyncio.get_event_loop()</span>
<span class="hljs-comment">#loop.run_until_complete(result)</span>
<span class="hljs-comment"># py3.7</span>
asycio.run(result)
</code></div></pre>
<h3><a id="33_await_65"></a>3.3 await</h3>
<p>await + 可等待对象(协程对象、Future、Task)</p>
<p>await就是等待对象的值得到结果之后在继续往下走</p>
<p>案例一:</p>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-keyword">import</span> asyncio
<span class="hljs-keyword">async</span> <span class="hljs-keyword">def</span> <span class="hljs-title function_">func</span>():
<span class="hljs-built_in">print</span>(<span class="hljs-string">"666"</span>)
<span class="hljs-comment"># 这里等待2秒,有其他任务执行其他任务,然后继续向后执行</span>
res = <span class="hljs-keyword">await</span> asyncio.sleep(<span class="hljs-number">2</span>)
<span class="hljs-built_in">print</span>(<span class="hljs-string">"结束"</span>, res)
asyncio.run(func())
</code></div></pre>
<p>案例二:</p>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-keyword">import</span> asyncio
<span class="hljs-keyword">async</span> <span class="hljs-keyword">def</span> <span class="hljs-title function_">others</span>():
<span class="hljs-built_in">print</span>(<span class="hljs-string">"start"</span>)
<span class="hljs-keyword">await</span> asyncio.sleep(<span class="hljs-number">2</span>)
<span class="hljs-built_in">print</span>(<span class="hljs-string">"end"</span>)
<span class="hljs-keyword">return</span> <span class="hljs-string">"返回值"</span>
<span class="hljs-keyword">async</span> <span class="hljs-keyword">def</span> <span class="hljs-title function_">func</span>():
<span class="hljs-built_in">print</span>(<span class="hljs-string">"执行协程函数内部代码"</span>)
<span class="hljs-comment"># 遇到IO操作挂起当前协程(任务),等IO操作完成之后再继续往下执行。</span>
<span class="hljs-comment"># 当前协程挂起时,事件循环可以去执行其他协程(任务)</span>
res = <span class="hljs-keyword">await</span> others()
<span class="hljs-built_in">print</span>(<span class="hljs-string">"IO请求结束,结果为:"</span>, res)
asyncio.run(func())
</code></div></pre>
<p>案例三</p>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-keyword">import</span> asyncio
<span class="hljs-keyword">async</span> <span class="hljs-keyword">def</span> <span class="hljs-title function_">others</span>():
<span class="hljs-built_in">print</span>(<span class="hljs-string">"start"</span>)
<span class="hljs-keyword">await</span> asyncio.sleep(<span class="hljs-number">2</span>)
<span class="hljs-built_in">print</span>(<span class="hljs-string">"end"</span>)
<span class="hljs-keyword">return</span> <span class="hljs-string">"返回值"</span>
<span class="hljs-keyword">async</span> <span class="hljs-keyword">def</span> <span class="hljs-title function_">func</span>():
<span class="hljs-built_in">print</span>(<span class="hljs-string">"执行协程函数内部代码"</span>)
<span class="hljs-comment"># 遇到IO操作挂起当前协程(任务),等IO操作完成之后再继续往下执行。</span>
<span class="hljs-comment"># 当前协程挂起时,事件循环可以去执行其他协程(任务)</span>
res1 = <span class="hljs-keyword">await</span> others()
<span class="hljs-built_in">print</span>(<span class="hljs-string">"IO请求结束,结果为:"</span>, res1)
res2 = <span class="hljs-keyword">await</span> others()
<span class="hljs-built_in">print</span>(<span class="hljs-string">"IO请求结束,结果为:"</span>, res2)
asyncio.run(func())
</code></div></pre>
<h3><a id="34_Task_128"></a>3.4 Task对象</h3>
<ul>
<li>
<p>py3.7</p>
</li>
<li>
<p>在事件循环中添加多个任务</p>
</li>
<li>
<p>Task用于并发调度协程,通过<code>asyncio.create_task(协程对象)</code>的方式创建爱你Task对象,这样可以让协程加入事件循环中等待被调度执行。除了使用<code>asyncio.create_task()</code>函数以外,还可以用更低层级的<code>loop_create_task()</code>或<code>ensure_future()</code>函数。不建议手动实例化Task对象。</p>
</li>
</ul>
<p>参考地址:<br />
https://www.bilibili.com/video/BV1dD4y127bD</p>
留言