什么是协程?
进程:程序在启动后,会在操作系统中作为一个进程存在。不同的进程之间互不影响,各自运行任务。
线程:每个进程为了保证多任务运行,会拆分为多个线程,线程共享进程的运行空间;但线程之间要进行切换时,开销比较高,需要保存线程的运行信息以便下次恢复,此时不可避免会影响效率。
协程:协程是线程的进一步划分,一个线程中运行多个协程;在线程不进行切换的前提下,使用协程就可以完成并发运算的操作。相对于线程切换实现的并发,协程更加轻量,且效率更高。
Python协程
python中,协程依靠async 和 await 两个关键字实现。
async 关键词放置在普通函数前,将函数设置为异步执行,交给 asyncio 去调度。
asyncio 在异步调度时,如果发现wait关键词,异步函数就不需要阻塞在这里,可以调度到其它Task中执行。
例如,在python中实现url并发下载:
代码语言:javascript复制async def download_url(url, session=None) :
fail = True
file_name = basename(uri)
assert session
try:
async with session.get(uri) as response:
if response.status == 404:
print('404 - Not found'))
return fail, url
if not response.status == 200:
print('Failed')
return fail, url
data = await response.read()
此时,可以同时启动 get(url),在 await 的时候,切换 task。
协程使用起来会更加高效,除了Python,在其它编程语言中也有体现,可以提高程序性能。