首页 > 编程语言 >Python异步编程

Python异步编程

时间:2023-07-12 14:45:59浏览次数:43  
标签:异步 fun1 fun2 Python 编程 url print def asyncio

协程

  • 不是计算机提供,程序员人为创造
  • 也称为微线程,是一种上下文切换技术(通过一个线程实现代码块互相切换执行)
  • 普通代码的执行流程自上而下顺序执行
def fun1():
    print(1)
    # ...
    print(2)

def fun2():
    print(3)
    # ...
    print(4)

fun1()
fun2()

- 结果: 等fun1执行完,再执行fun2
  • 实现方法

    • greenlet: 早期模块
    • yield 关键字
    • asyncio装饰器(py3.4开始支持)
    • async,await关键字(py3.5开始支持,推荐)
  • greenlet实现协程

from greenlet import greenlet

def fun1():
    print(1)
    gr2.switch() # 跳转到fun2
    print(2)
    gr2.switch()

def fun2():
    print(3)
    gr1.switch() # 跳转到fun1
    print(4)

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

gr1.switch() # 开始执行

- 返回结果:
	1
    3
    2
    4

  • yield示例
def fun1():
    yield 1
    yield from fun2() # 切换到 fun2
    yield 2

def fun2():
    yield 3
    yield 4

f1 = fun1()
for item in f1:
    print(item)
    
- 返回结果:
	1
    3
    4
    2
  • asyncio示例
import asyncio


# 先定义两个协程对象
@asyncio.coroutine
def fun1():
    print(1)
    # 这里不能直接 asyncio.sleep(2)(报错信息: coroutine 'sleep' was never awaited)
    yield from asyncio.sleep(2)
    print(2)
    
@asyncio.coroutine
def fun2():
    print(3)
    yield from asyncio.sleep(2)
    print(4)

# 创建任务
tasks = [
    asyncio.ensure_future(fun1()),
    asyncio.ensure_future(fun2())
]

# 创建'轮询对象'并执行任务
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))
  • async & await示例
import asyncio

async def fun1(): # 协程函数对象
    print(1)
    await asyncio.sleep(2) # 等的时候切换到其他代码块并执行
    print(2)

async def fun2():
    print(3)
    await asyncio.sleep(2)
    print(4)

tasks = [
    asyncio.ensure_future(fun1()),
    asyncio.ensure_future(fun2())
]

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

- 结果:

	1
    3
    2
    4

  • 非异步协程下载图片示例
import requests

url_list = [
    'https://www.aclas.com/uploadfile/uploadfile/225986195944098.png',
    'https://www.aclas.com/uploadfile/uploadfile/26507715014500.jpg',
    'https://www.aclas.com/uploadfile/uploadfile/34698673154118.jpg',
]


def download_image(url):
    filename = url.rsplit('/')[-1]
    res = requests.get(url)
    with open(filename, 'wb') as file:
        file.write(res.content)
    print(filename + '下载完成')

if __name__ == '__main__':
    for url in url_list:
        download_image(url)

  • 异步协程下载图片示例
import aiohttp
import asyncio

url_list = [
    'https://www.aclas.com/uploadfile/uploadfile/225986195944098.png',
    'https://www.aclas.com/uploadfile/uploadfile/26507715014500.jpg',
    'https://www.aclas.com/uploadfile/uploadfile/34698673154118.jpg',
]

# 下载图片
async def download_image(request,url):
    print('开始发送请求',url)
    async with request.get(url,verify_ssl=False) as res:
        content = await res.content.read()
        filename = url.rsplit('/')[-1]
        with open(filename, 'wb') as file:
            file.write(content)
        print(filename + '下载完成')
        
# 创建请求对象并创建任务,等待任务执行完成
async def main():
    async with aiohttp.ClientSession() as request:
        tasks = [asyncio.create_task(download_image(request,url)) for url in url_list]
        await asyncio.wait(tasks)
    
    
if __name__ == '__main__':
    # asyncio.run(main()) 这种写法会报错...
    loop = asyncio.get_event_loop() # 创建'轮询对象'并开始执行
    loop.run_until_complete(main())

标签:异步,fun1,fun2,Python,编程,url,print,def,asyncio
From: https://www.cnblogs.com/qinganning/p/17547454.html

相关文章

  • 【雕爷学编程】Arduino动手做(117)---P10V706LED屏模组4
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞......
  • 用Python编写网页自动答题工具,满分轻松到手,你就是全班最靓的仔!
    最近自动答题的外包很多,来给大家分享一下如何用Python来实现自动答题。好了话不多说,我们开始操作。首先你需要准备这些环境使用Python3.8解释器Pycharm编辑器 模块使用importrequests--->数据请求模块pipinstallrequestsimportrefromsele......
  • Shell 编程常用参考
    Shell特殊变量$0,$#,$*,$@,$?,$$和命令行参数Shell中的特殊变量参考如下表:变量含义$0当前脚本的文件名$n传递给脚本或函数的参数。n是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2$#传递给脚本或函数的参数个数$*传递给脚本或函数......
  • 【雕爷学编程】Arduino动手做(117)---P10V706LED屏模组3
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞......
  • python安装教程
    1.下载安装python解释器:地址:https://www.python.org/downloads/release/python-372/(选择此项) 2.pycharm安装教程:安装地址:https://www.jetbrains.com/pycharm/download/download-thanks.html?platform=windows&code=PCC ......
  • python3。1
          print('您拥有三次机会输入正确的账号和密码')print('三次输入错误,账号将被锁定')i=3whilei>0:user_name=input('请输入您的账号:')psw=input('请输入密码:')ifuser_name=='zy'andpsw=='666666':......
  • 【雕爷学编程】Arduino动手做(117)---P10V706LED屏模组2
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞......
  • 解决python升级的具体操作步骤
    如何升级Python版本作为一名经验丰富的开发者,我将帮助你学习如何升级Python版本。在本文中,我将为你提供一个详细的步骤表格,并解释每一步应该做什么,并提供相应的代码示例。升级Python的步骤以下是升级Python版本的步骤:步骤描述步骤1确定当前Python版本步骤2下载......
  • python学习笔记:继承与超类
    与java类似,继承的出现是为了提高代码的重复利用率,避免多次输入同样的代码。而超类就是java中的父类。1.继承要指定超类,可在定义类时,在class语句中的类名后加上超类名基类就是超类,派生类就是子类格式classDog:# passclassBobo(Dog):#Dog类的子类 pass子类会......
  • Python爬取哔哩哔哩视频
    Python爬取哔哩哔哩视频一、环境准备我这里使用的是环境如下仅供参考:开发工具:pycharmpython环境:python-3.8.0依赖的包:shutil,os,re,json,choice,requests,lxml二、页面分析我在这里就拿前段时间非常火的马老师的视频来举例子吧。视频链接:https://www.bilibili.com/video/BV1Ef4......