IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Python 协程 -> 正文阅读

[Python知识库]Python 协程

1. 多线程多进程、协程

  • 计算机中提供了:线程、进程 用于实现并发(真实存在)
  • 协程(Coroutine),是程序员通过代码搞出来的东西(非真实存在)
  • 协程也可以被称为微线程,是一种用户态内上下文切换技,其实就是通过一个线程实现代码块相互切换执行

2. Python中有多种方式可以实现协程

  • greenlet
    from greenlet import greenlet
    
    def func1():
    	print(1)
    	gr2.switch()  # 切换到func2函数
    	print(2)
    	gr2.switch()  # 切换到func2函数,从上一次执行的位置继续向后执行
    
    def func2():
    	print(3)
    	gr1.switch()  # 切换
    	print(4)
    
    gr1 = greenlet(func1)
    gr2 = greenlet(func2)
    gr1.switch()  # 去执行func1函数
    
  • yield
    def func1():
    	yield 1
    	yield from func2()
    	yield 2
    
    def func2():
    	yield 3
    	yield 4
    
    f1 = func1()
    for item in f1:
    	print(item)
    
  • 以上两种方法都实现了协程,但无实用意义,来回切换,反倒使程序执行速度更慢
  • 如果使用协程?不要让用户手动切换,而是遇到IO操作时能自动切换
  • Python3.4之后推出了asyncio模块 + Python3.5推出async、async语法,内部基于协程,并且遇到IO请求自动化切换
    import asyncio
    
    async def func1():
    	print(1)
    	await asyncio.sleep(2)
    	print(2)
    
    async def func2():
    	print(3)
    	await asyncio.sleep(2)
    	print(4)
    
    tasks = [
    	asyncio.ensure_future(func1()), 
    	asyncio.ensure_future(func2())
    ]
    loop = asyncio.get_event_loop()
    loop.run_until_complete(asyncio.wait(tasks))
    
    import aiohttp
    import asyncio
    async def fetch(seesion, url):
    	print('发送请求:', url)
    	async with session.get(url, verify_ssl=False) as response:
    		content = await response.content.read()
    		file_name = url.rsplit('_')[-1]
    		with open(file_name, mode='wb') as file_object:
    			file_object.write(content)
    	
    async def main():
    	async with aiohttp.ClientSession() as session:
    		url_list = [
    			'http://www.autoimg.com/....',
    			'http://www.autoimg.com/....',
    			'http://www.autoimg.com/....'
    		]
    		tasks = [asyncio.create_task(fetch(session, url)) for url in url_list]
    		await asyncio.wait(tasks)
    		
    if __name__ = '__main__':
    	asyncio.run(main))
    
  • 在处理IO请求时,协程通过一个线程就可以实现并发操作

3. 协程、线程、进程的区别

  • 线程,是计算机中可以被CPU调度的最小单元
  • 进程,是计算机资源分配的最小单元(进程为线程提供资源)
  • 一个进程中可以有多个线程,同一个进程中的线程可以共享此进程中的资源
  • 由于CPython解释器中GIL的存在:
    • 线程,适用于IO密集型操作
    • 进程,适用于计算密集型操作
  • 协程,也可以被称为微线程,是一种用户态内的上下文切换技术,在开发中结合遇到IO自动切换,就可以通过一个线程实现并发操作
  • 故,在处理IO操作时,协程比线程更加节省开销(协程的开发难度大一些)
  • 支持协程的Python框架:FastAPI、Tornado、Sanic、Django 3、aiohttp等
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-06-29 19:00:05  更:2022-06-29 19:02:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 12:13:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码