python asyncio异步编程

一、协程

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

        对于协程而言,并不是计算机所提供的,计算机所提供的只有进程和线程、而协程则是通过程序员人为所创造的。我们通常将协程称为微线程,是一种用户态的轻量级线程。协程不像线程和进程那样,需要进行系统内核上的上下文切换,协程的上下文切换是由程序员决定的。

在Python中有多种方式可以实现协程,例如:

1、greenlet,是一个第三方模块,用于实现协程代码(Gevent协程就是基于greenlet实现)
2、yield,生成器,借助生成器的特点也可以实现协程代码。
3、asyncio,在Python3.4中引入的模块用于编写协程代码。
4、async & awiat,在Python3.5中引入的两个关键字,结合asyncio模块可以更方便的编写协程代码。【推荐】

二、异步编程

异步编程的两大核心: 事件循环 + 协程函数

1、事件循环

        循环检查并执行一些任务,在特定条件下终止循环,这些任务会有三种运行状态: 待执行,正在执行,IO状态

# 伪代码
任务列表 = [ 任务1, 任务2, 任务3,... ]
while True:
    可执行的任务列表,已完成的任务列表 = 去任务列表中检查所有的任务,将'可执行'和'已完成'的任务返回
    for 就绪任务 in 已准备就绪的任务列表:
        执行已就绪的任务
    for 已完成的任务 in 已完成的任务列表:
        在任务列表中移除 已完成的任务
    如果 任务列表 中的任务都已完成,则终止循环

asyncio 生成或获取事件循环

import asyncio
 
# 生成或获取事件循环对象loop
loop = asyncio.get_event_loop()  
 
# 将协程函数(任务)提交到事件循环的任务列表中,协程函数执行完成之后终止。
# run_until_complete 会检查协程函数的运行状态,并执行协程函数
loop.run_until_complete( func() ) 
 
 
注意: python3.7+ 后的写法:
asyncio.run( func() )  # run方法内部封装了 get_event_loop() 与 run_until_complete()

2、协程函数

定义协程函数 :async def 关键字 (python3.5+)

协程对象:协程函数运行的结果即为协程对象

async def func1():
    pass
 
f = func()  # 协程函数运行生成协程函数对象
 
注意: 协程函数加括号不会执行协程函数内部代码,只是得到一个协程对象

如果要运行协程函数内容代码,必须将协程函数交给asyncio事件循环来执行 

import asyncio
 
async def func():
    print(1)
 
f = func()
 
loop = asyncio.get_event_loop()
loop.run_until_complete( f )
# -*- coding = utf-8 -*-
# @Time : 2024/1/27 19:20
# @Author: Frank
# @File: asyncHttp.py
# @Software: PyCharm
import asyncio

import aiohttp


async def fetch(session, url):
    print("发送请求:", url)
    async with session.get(url, verify_ssl=False) as response:
        content = await response.content.read()
        file_name = url.rsplit("/")[-1] + '.png'
        with open(file_name, mode="wb") as file_object:
            file_object.write(content)
            print("下载完成")


async def main():
    async with aiohttp.ClientSession() as session:
        url_list = [
            'https://t7.baidu.com/it/u=4198287529,277447

你可能感兴趣的:(python,开发语言,前端)