Python异步编程_asyncio

1.协程

协程不是计算机提供的,它是程序员创造的。

协程-Co_routine,也可以称之为微线程,是一种用户态内的上下文切换技术,简而言之,其实就是通过一个线程实现代码块相互切换执行。

实现协程的几种方法:

  • greenlet,早期模块

  • yield关键字

  • asyncio装饰器(python3.4及其之后)

  • async、await关键字(python3.5及其之后)【推荐】

1.1 greenlet实现协程

pip3 install greenlet 
from greenlet import greenlet def func1(): print(1) # step1: output 1 gr2.switch() # step3: switch to function func2 print(2) # step6: output 2 gr2.switch() # step7: 切换到func2函数,从上一次执行的位置继续向后执行 def func2(): print(3) # step4: output 3 gr1.switch() # step3: 切换到func1函数,从上一次执行的位置继续向后执行 print(4) # step6: output 4 gr1 = greenlet(func1) gr2 = greenlet(func2) gr1.switch() # step1: 去执行func1函数 

1.2 yield关键字

def func1(): yield 1 yield from func2() yield 2 def func2(): yield 3 yield 4 f1 = func1() for item in f1: print(item) 

1.3 asyncio

在python3.4及其之后的版本支持

import asyncio @asyncio.corountine def func1(): print(1) yield from asyncio.sleep(2) # 遇到io耗时操作,自动化切换到tasks中的其他任务 print(2) @asyncio.corountine def func2(): print(3) yield from asyncio.sleep(2) # 遇到io耗时操作,自动化切换到tasks中的其他任务 print(4) tasks = [ asyncio.ensure_future(func1()), asyncio.ensure_future(func2()) ] loop = asyncio.get_event_loop() loop.run_until_complete(asyncio.wait(tasks)) 

注意:遇到io阻塞的时候会自动切换,此时线程并没有闲着,一直在执行任务。

1.4 async & await 关键字

在python3.5及其以后版本

import asyncio async def func1(): print(1) await asyncio.sleep(2) # 遇到io耗时操作,自动化切换到tasks中的其他任务 print(2) async def func2(): print(3) await asyncio.sleep(2) # 遇到io耗时操作,自动化切换到tasks中的其他任务 print(4) tasks = [ asyncio.ensure_future(func1()), asyncio.ensure_future(func2()) ] loop = asyncio.get_event_loop() loop.run_until_complete(asyncio.wait(tasks)) 

2.协程的意义

充分的利用线程,不让线程出现阻塞从而浪费硬件资源,同时耗费更少的时间去完成任务。

3.异步编程

3.1 事件循环

一个死循环,去检测并执行某些代码7

# 伪代码: 任务列表 = [任务1, 任务2, 任务3, ...] while True: 可执行的任务列表, 已完成的任务列表 = 去任务列表中检查所有的任务,将‘可执行’和‘已完成’的任务返回 for 就绪任务 in 可执行任务列表: 执行已就绪的任务 for 已完成的任务 in 已完成的任务列表: 在任务列表中移除 已完成任务 如果 任务列表中的任务都已完成,则终止循环 
import asyncio # 去生成或获取一个时间循环 loop = asyncio.get_event_loop() # 将任务放到'任务列表' loop.run_until_complete(任务) 

3.2 快速上手

首先了解2个定义:

协程函数——定义函数的时候async def 函数名

协程对象——执行协程函数()得到的协程对象

import asyncio async de
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python异步编程是一种编写高效、阻塞的代码的方式,其中asyncioPython标准库中用于实现异步编程的模块。它提供了一组用于编写协程、任务和事件循环的API。 在异步编程中,可以使用async/await关键字定义协程函数,协程函数可以在遇到IO操作时主动让出CPU,而不会阻塞其他任务的执行。asyncio通过事件循环(event loop)来调度协程的执行,事件循环负责管理协程的调度和IO事件的处理。 以下是一些关键概念和组件: 1. 协程(coroutine):使用async/await关键字定义的可等待对象,可以在IO操作时暂停并让出CPU,以便其他任务执行。 2. 任务(task):表示协程的执行,可以通过asyncio.create_task()函数创建任务。 3. 事件循环(event loop):负责调度和执行协程,处理IO事件。 4. Future对象:表示异步操作的结果,可以通过asyncio.Future()创建。 5. 异步函数(async function):使用async关键字定义的函数,可以在其中使用await关键字等待其他协程或异步操作的完成。 6. 回调函数(callback):在异步操作完成时被调用的函数。 使用asyncio进行异步编程的一般步骤如下: 1. 创建一个事件循环对象:loop = asyncio.get_event_loop() 2. 定义协程函数或异步函数。 3. 创建任务:task = loop.create_task(协程函数或异步函数()) 4. 运行事件循环:loop.run_until_complete(task) 5. 在需要的地方使用await关键字等待异步操作的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值