在计算机编程中,协程(Coroutine)指的是一种用户态线程。在协程中,多个协程看起来像同时执行,但其实是交替执行的,又称协作式多任务。
协程和线程不同的地方在于,协程是由程序员主动控制调度的,而不是由操作系统控制。线程是由操作系统控制调度的,线程切换时需要切换上下文,而协程不需要,因此省去了大量的开销,效率也更高。
协程最早的应用是在生成器(Generator)中,利用 Python 的 yield 关键字可以实现协程。以多任务下载文件为例,利用协程可以实现异步下载,提高下载速度。
import asyncioimport aiohttpasync def download_file(url, filename):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
with open(filename, 'wb') as f:
while True:
chunk = await response.content.read(1024)
if not chunk:
break
f.write(chunk)
print(f'{filename} downloaded')urls = [
'https://www.python.org/static/img/python-logo.png',
'https://www.djangoproject.com/m/img/logos/django-logo-negative.png',
'https://www.docker.com/sites/default/files/horizontal.png',]tasks = [download_file(url, url.split('/')[-1]) for url in urls]loop = asyncio.get_event_loop()loop.run_until_complete(asyncio.wait(tasks))
以上是基于 Python 的异步库 asyncio 写的异步下载代码,其中 download_file 函数就是一个协程,它利用异步 IO 的方式实现了异步下载。
协程并不是什么高深实用的技巧,它很容易理解和使用,只需要掌握 yield 或者 async/await 关键字即可。
「艾尔登法环」梅琳娜手办开订 立体手办▪
万代「艾尔登法环」白狼战鬼手办开订 立体手办▪
「夏目友人帐」猫咪老师粘土人开订 立体手办▪
「五等分的新娘∬」中野三玖·白无垢版手办开订 立体手办▪
「海贼王」乌索普Q版手办开订 立体手办▪
良笑社「初音未来」新手办开订 立体手办▪
「黑岩射手DAWN FALL」死亡主宰手办开订 立体手办▪
「盾之勇者成名录」菲洛手办登场 立体手办▪
「魔法少女小圆」美树沙耶香手办开订 立体手办▪
「咒术回战」七海建人粘土人登场 立体手办▪
「五等分的新娘」中野二乃白无垢手办开订 立体手办▪
「为美好的世界献上祝福!」芸芸粘土人开订 立体手办▪
「公主连结 与你重逢」六星可可萝手办开订 立体手办▪
「女神异闻录5」Joker雨宫莲手办开订 立体手办▪
「间谍过家家」约尔・福杰粘土人登场 立体手办▪
「街角魔族 2丁目」吉田优子手办开订 立体手办▪
「火影忍者 疾风传」旗木卡卡西·暗部版粘土人登场 立体手办▪
「佐佐木与宫野」宫野由美粘土人开订 立体手办▪
「盾之勇者成名录」第2季拉芙塔莉雅手办开订 立体手办▪
「咒术回战」两面宿傩Q版坐姿手办开订 立体手办▪
「DATE·A·BULLET」时崎狂三手办开订 立体手办▪
「狂赌之渊××」早乙女芽亚里粘土人开订 立体手办▪
「魔道祖师」魏无羨粘土人开订 立体手办▪
「新·奥特曼」奥特曼手办现已开订 立体手办▪