天天动画片 > 八卦谈 > 协程

协程

八卦谈 佚名 2023-09-24 10:41:24

在计算机编程中,协程(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 关键字即可。


本文标题:协程 - 八卦谈
本文地址:www.ttdhp.com/article/40257.html

天天动画片声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。
扫码关注我们