首页 > 编程语言 >python——异步编程代码实战

python——异步编程代码实战

时间:2023-04-04 18:08:40浏览次数:39  
标签:异步 task python 编程 jpg url print def asyncio


摘要

主要介绍python中相关的异步编程的原理和是代码的实战

协程实现

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

协程的优点:在一个线程中如果遇到IO等待时间,线程不会傻傻等,利用空闲的时候再去干点其他事。

greenlet 实现协程

from greenlet import greenlet

def fun1():
    print(1)
    gr2.switch()
    print(2)
    gr2.switch()

def fun2():
    print(3)
    gr1.switch()
    print(4)

gr1 = greenlet(fun1)
gr2 = greenlet(fun2)

gr1.switch()

yield 关键字(在企业的代码不会使用)

def fun3():
    yield 1
    yield from fun4()
    yield 2

def fun4():
    yield 3
    yield 4

f = fun3()
for item in f:
    print(item)

#显示的结果
----------------------------------------------------
1
3
4
2

asyncio 装饰器(py3.4)

import asyncio

@asyncio.coroutines
def fun5():
    print(1)
    yield from asyncio.sleep(2)  # 遇到IO的操作的时候自动切换到task中的其他任务
    print(2)
    
@asyncio.coroutines
def fun6():
    print(3)
    yield from asyncio.sleep(2)  # 遇到IO的操作的时候自动切换到task中的其他任务
    print(4)

task = [
    asyncio.ensure_future(fun5()),
    asyncio.ensure_future(fun6())
]

loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(task))

#显示结果
1
3
2
4

async & await关键字(py3.5)推荐的使用

import asyncio

async def fun7():
    print(7)
    await asyncio.sleep(2)  # 遇到IO的操作的时候自动切换到task中的其他任务
    print(8)

async def fun8():
    print(9)
    await asyncio.sleep(2)  # 遇到IO的操作的时候自动切换到task中的其他任务
    print(10)

task = [
    asyncio.ensure_future(fun7()),
    asyncio.ensure_future(fun8())
]

loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(task))

图片下载实战

采用的普通方式进行图片的下载

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@version: 1.0
@author: xjl
@file: 图片的下载.py
@time: 2021/9/12 16:49
"""
import requests

def download_images(url):
    print("开始下载", url)
    response = requests.get(url)
    print("下载完成")
    # 保存文件到本地中
    file_name = url.rsplit('_')[-1]
    with open(file_name, mode='wb') as file_object:
        file_object.writable(response.content)
    print("保存图片的功能完成")

if __name__ == "__main__":
    url_list = [
        'https://img.alicdn.com/imgextra/i3/127167800/O1CN01lywipS27US0reYkHE_!!0-saturn_solar.jpg_468x468q75.jpg',
        'https://img.alicdn.com/imgextra/i2/127167800/O1CN01M4cuWt27US1BH6Ke6_!!0-saturn_solar.jpg_468x468q75.jpg',
        'https://img.alicdn.com/imgextra/i4/206720011/O1CN01HKfJ251Bx53r6kuqZ_!!0-saturn_solar.jpg_468x468q75.jpg'
       ]
    for item in url_list:
        download_images(item)

采用的异步(协程的方式)方式进行图片的下载

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@version: 1.0
@author: xjl
@file: 图片的下载异步操作.py
@time: 2021/9/12 17:04
"""

import aiohttp
import asyncio

async def fetch(session, url):
    print("发送请求")
    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)
        print("下载完成")

async def main():
    async with aiohttp.ClientSession() as session:
        url_list = [
            'https://img.alicdn.com/imgextra/i3/127167800/O1CN01lywipS27US0reYkHE_!!0-saturn_solar.jpg_468x468q75.jpg',
            'https://img.alicdn.com/imgextra/i2/127167800/O1CN01M4cuWt27US1BH6Ke6_!!0-saturn_solar.jpg_468x468q76.jpg',
            'https://img.alicdn.com/imgextra/i4/206720011/O1CN01HKfJ251Bx53r6kuqZ_!!0-saturn_solar.jpg_468x468q85.jpg'
        ]
        task = [asyncio.get_event_loop().create_task(fetch(session, url)) for url in url_list]
        await asyncio.wait(task)

if __name__ == '__main__':
    # asyncio.run(main()) 同文件夹下有 asyncio.py
    asyncio.get_event_loop().run_until_complete(main())

【路飞】Python异步编程2020年最新版【asyncio】【异步编程】【协程】_哔哩哔哩_bilibili 

标签:异步,task,python,编程,jpg,url,print,def,asyncio
From: https://blog.51cto.com/u_13643065/6169205

相关文章

  • Python——单元测试的实现
    摘要单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作。在软件开中的测试是很重要的一部分。python测试相关库unittest,内置库,模仿PyUnit写的,简洁易用,缺点是比较繁琐。nose,测试发现,发现并运行测试。pytest,笔者目前喜欢用这个,写起来很方便,并且很多知名开源项......
  • 并发编程——JUC并发大厂面试问题
    摘要现如今,不管是应届毕业生还是工作了三五年之内的工程师,在面试招聘的时候JUC并发编程的是必须掌握的一个技能,否者你将会被面试官玩弄。本博文将整理有关于的JUC的大厂面试问题和答案。帮助大家在面试过程中能够回答面试官问题的一二。同时本人也总结相关的面试问题的在相关文档中......
  • SQL Server 数据库T-SQL编程
    1、T-SQL编程通过SQL语句来完成业务的处理,执行编写好的sql语句,就可以完成业务处理。2、局部变量SQLserver中变量分为:局部变量和全局变量。全局变量,在全局可用,系统自定义,用户不可以定义全局变量,用不不可以修改全局变量,全局变量以“@@”开头局部变量就是一个能够拥有......
  • python PIL个人使用记录
    pythonPIL个人使用记录1、gif转pngdefgif_to_png(filename:str):"""gif图片一帧一帧转换为很多png图片:paramfilename::return:"""filename=filename.strip()filename=os.path.abspath(filename)assertos.path.s......
  • 系统化学习前端之JavaScript(ES6:异步编程)
    前言JavaScript异步编程这块东西比较多,涉及到宏任务和微任务,所以单开一个篇幅梳理一下。同步和异步同步和异步是一种宏观概念,具体表现在JavaScript中,是同步任务和异步任务,即同步函数和异步函数。同步同步指函数在JavaScript同步执行。同步函数执行过程:A函数进入函数调......
  • Python系列005
    控制设备仪器————电源初识importpyvisa#ConnecttotheGPIBinstrumentrm=pyvisa.ResourceManager()classPiDevice:def__init__(self,addressId):self.addressId=addressIddefPiPower(self):whoPower=rm.open_resource(self.a......
  • 学习笔记——Python基础
    字符串索引str='我是一名学生'print(str[0])#输出“我”print(str[-6])#输出“我”字符串切片:把数据对象的一部分拿出来str='我是一名学生'print(str[2:4])#输出“一名”print(str[-4:-2])#输出“一名”#获取字符串长度:len()str='我是一名学生'le......
  • 跟着查老四学Python Day 6:文件操作和异常处理
    文件操作例行寒暄之后,课程正式开始查老四:好的,我们来学习一下Python中的文件操作。文件操作是编程中非常基础和重要的一部分,它允许我们读取和写入文件。Python支持文本文件和二进制文件的读写,下面我们来逐一介绍。首先,我们需要打开一个文件。Python中使用open()函数来打开文件,它的语......
  • 【Python】ini解析ERROR:没有实例属性‘__getintem__’
    abaquspython搭配ini时,出现AttributeError:ConfigParserinstancehasnoattribute'getitem'20230404edit情况错误代码:fromConfigParserimportConfigParserconf=ConfigParser()conf.read(IniFilePath)layupFile=conf['DampCal']['lay......
  • Python 内置函数map()
    内置函数mapmap(func,可迭代对象1,可迭代对象2...)map函数可以接收一个函数和一个或多个可迭代对象。接收的func函数有几个参数,就需要接收几个可迭代对象。map接收的函数会作用于可迭代对象的每个元素,并且返回一个值。map将可迭代对象的每个元素经过func函数处理返回的值组成......