一、协程简介
协程(Coroutine),又称微线程,单线程当中的"并发"。通常我们认为线程是轻量级的进程,因此我们也把协程理解为轻量级的线程即微线程。
子程序调用是通过栈实现的,一个线程就是执行一个子程序。子程序调用总是一个入口,一次返回,调用顺序是明确的。协程执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行(在一个子程序中中断,去执行其他子程序,不是函数调用,类似CPU的中断)。
协程没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。协程不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,所以执行效率比多线程高很多。
协程是一个线程执行,如果想利用多核CPU,就要结合多进程 协程使用,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能。
传统的生产者-消费者模型是一个线程写消息,一个线程取消息,通过锁机制控制队列和等待,一不小心就可能死锁。
协程中,生产者生产消息后,直接通过await跳转到消费者开始执行,待消费者(async)执行完毕后,切换回生产者继续生产,效率极高。
二、协程示例
2.1 asyncio 语法
asyncio 是用来编写并发代码的库,使用 async/await 语法。asyncio被用作多个提供高性能Python异步框架的基础,包括网络和网站服务,数据库连接库,分布式任务队列等等。asyncio往往是构建 IO 密集型和高层级结构化网络代码的最佳选择。
执行 coroutine coro 并返回结果。此函数会运行传入的协程,负责管理 asyncio 事件循环,终结异步生成器,并关闭执行器。当有其他 asyncio 事件循环在同一线程中运行时,此函数不能被调用。
如果 debug 为 True,事件循环将运行于调试模式。 False 将显式地禁用调试模式。 使用 None 将沿用全局 Debug 模式 设置。
coro:将协程封装为一个Task并调度其执行。返回 Task 对象。
name:不为 None,它将使用 Task.set_name() 来设为任务的名称。
context:可选的参数允许指定自定义的 contextvars.Context 供 coro 运行。 当未提供 context 时将创建当前上下文的副本。
阻塞 delay 指定的秒数。如果指定了 result,则当协程完成时将其返回给调用者。sleep() 总是会挂起当前任务,以允许其他任务运行。将 delay 设为 0 将提供一个经优化的路径以允许其他任务运行。 这可供长期间运行的函数使用以避免在函数调用的全过程中阻塞事件循环。
2.2 协程示例
# -*- coding: utf-8 -*-
import asyncio
import time
async def read_books():
print("----------------读书协程开始-------------")
for i in range(10):
await read_book(i)
print("----------------读书协程关闭-------------")
async def read_book(book_id):
await asyncio.sleep(1)
print('done reading:', book_id)
#为了标识执行代码的入口和避免文件被导入时被执行,我们可以将执行代码放入main函数中。
if __name__ == '__main__':
asyncio.run(read_books())
PS D:\Shangouxuehui_Git> & D:/Python312/python.exe d:/Shangouxuehui_Git/PythonCases/coroutine_sample.py
----------------读书协程开始-------------
done reading: 0
done reading: 1
done reading: 2
done reading: 3
done reading: 4
done reading: 5
done reading: 6
done reading: 7
done reading: 8
done reading: 9
----------------读书协程关闭-------------
源码:https://github.com/ShanGouXueHui/PythonCases
##山狗学会 License Start##
转载请注明出处,"今日头条"创作者"山狗学会“ ,注明出处即授权,未注明出处罚款100万元
主页链接:
##山狗学会 License End##
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved