Python(三十八)python协程(2)

简介: 三:asyncio(>=python3.4)Python3.4以上的版本还可以使用asyncio来实现协程,具体代码如下:ruby复制代码#!/usr/bin/python3# -*- coding: utf-8 -*-# @Time : 2022/3/17 19:38# @Author : camellia# @Email : 805795955@qq.com# @File : coroutine.py# @Software: PyCharm# 测试协程程序import asyncio@asyncio.coroutinedef fun1():

三:asyncio(>=python3.4)

Python3.4以上的版本还可以使用asyncio来实现协程,具体代码如下:

ruby

复制代码

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time    : 2022/3/17 19:38
# @Author  : camellia
# @Email   : 805795955@qq.com
# @File    : coroutine.py
# @Software: PyCharm
# 测试协程程序
import asyncio
@asyncio.coroutine
def fun1():
    print(1)
    yield from asyncio.sleep(1)
    print(2)
@asyncio.coroutine
def fun2():
    print(3)
    yield from asyncio.sleep(1)
    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

Asyncio这个就比较厉害了,他是自动切换执行方法的。上边我们看到的yield与greenled都是我们人为控制的。这就很高级。

四:async await关键字(>=python3.5)(推荐使用)

Python3.5以上才可以使用async与await,这两个关键字其实就是替代我们上边使用到的yield关键字,因此我们只需要将上方的程序做一下小修改即可:

python

复制代码

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time    : 2022/3/17 19:38
# @Author  : camellia
# @Email   : 805795955@qq.com
# @File    : coroutine.py
# @Software: PyCharm
# 测试协程程序
import asyncio
async def fun1():
    print(1)
    await asyncio.sleep(1)
    print(2)
async def fun2():
    print(3)
    await asyncio.sleep(1)
    print(4)
# 任务列表
tasks = [
    asyncio.ensure_future(fun1()),
    asyncio.ensure_future(fun2())
]
# 时间循环
loop = asyncio.get_event_loop()
# 执行
loop.run_until_complete(asyncio.wait(tasks))

 

以上大概就是python中四种实现协程的方式。

五:协程的意义

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

干说没有代码实现来的醒目。下边我们使用一个例子来展示一下:

下载三张图片,第一种实现方式,使用正常的同步下载。

第二种实现方式使用协程来下载。对比下载时间。

同步爬取:

python

复制代码

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time    : 2022/3/17 19:38
# @Author  : camellia
# @Email   : 805795955@qq.com
# @File    : coroutine.py
# @Software: PyCharm
# 测试协程程序
import time
import requests
import random
import string
import asyncio
start =time.clock()
def getImage():
    """
    :name 爬取网络图片
    :param url: 图片url
    :param num: 图片名称
    :return: 无返回值
    """
    lis = [
        "https://resource.guanchao.site/uploads/sowing/welcome-image3.jpg",
        "https://resource.guanchao.site/uploads/sowing/welcome-image7.jpg",
        "https://resource.guanchao.site/uploads/sowing/welcome-image5.jpg"
    ]
    for item in lis:
        # 1:指定url
        # url = "https://resource.guanchao.site/uploads/sowing/welcome-image3.jpg"
        # 2:模拟网络请求链接
        responce = requests.get(url=item)
        print('爬取:'+item)
        # 3:获取响应数据,content获取二进制数据
        content = responce.content
        filename = './img/' + ''.join(random.sample(string.ascii_letters + string.digits, 8)) + '.jpg'
        # 4:持久化存储
        with open(filename, 'wb') as fe:
            fe.write(content)
            print('爬取完成')
getImage()
end = time.clock()
print('Running time: %s Seconds'%(end-start))

输出:

ruby

复制代码

爬取:https://resource.guanchao.site/uploads/sowing/welcome-image3.jpg
爬取完成
爬取:https://resource.guanchao.site/uploads/sowing/welcome-image7.jpg
爬取完成
爬取:https://resource.guanchao.site/uploads/sowing/welcome-image5.jpg
爬取完成
Running time: 2.4804463 Seconds

协程爬取:

协程爬取使用aiohttp模块

python

复制代码

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time    : 2022/3/17 19:38
# @Author  : camellia
# @Email   : 805795955@qq.com
# @File    : coroutine.py
# @Software: PyCharm
# 测试协程程序
import time
import requests
import random
import string
import asyncio
import aiohttp
start =time.clock()
async def fetch(session,url):
    print('发送请求:'+url)
    async with session.get(url,verify_ssl=False) as response:
        content = await response.content.read()
        filename = './img/' + ''.join(random.sample(string.ascii_letters + string.digits, 8)) + '.jpg'
        # 4:持久化存储
        with open(filename, 'wb') as fe:
            fe.write(content)
            print('爬取完成')
async def mains():
    async with aiohttp.ClientSession() as session:
        lis = [
            "https://resource.guanchao.site/uploads/sowing/welcome-image3.jpg",
            "https://resource.guanchao.site/uploads/sowing/welcome-image7.jpg",
            "https://resource.guanchao.site/uploads/sowing/welcome-image5.jpg"
        ]
        tasks = [asyncio.create_task(fetch(session,url)) for url in lis]
        await asyncio.wait(tasks)
# asyncio.run(mains())
loop = asyncio.get_event_loop()
loop.run_until_complete(mains())

执行代码:

ruby

复制代码

发送请求:https://resource.guanchao.site/uploads/sowing/welcome-image3.jpg
发送请求:https://resource.guanchao.site/uploads/sowing/welcome-image7.jpg
发送请求:https://resource.guanchao.site/uploads/sowing/welcome-image5.jpg
爬取完成
爬取完成
爬取完成
Running time: 1.8801726 Seconds

我们可以根据 输出的文字顺序看到代码是如何执行的。并且执行速度更快。

有好的建议,请在下方输入你的评论。

目录
相关文章
|
24天前
|
调度 Python
python知识点100篇系列(20)-python协程与异步编程asyncio
【10月更文挑战第8天】协程(Coroutine)是一种用户态内的上下文切换技术,通过单线程实现代码块间的切换执行。Python中实现协程的方法包括yield、asyncio模块及async/await关键字。其中,async/await结合asyncio模块可更便捷地编写和管理协程,支持异步IO操作,提高程序并发性能。协程函数、协程对象、Task对象等是其核心概念。
|
14天前
|
NoSQL 关系型数据库 MySQL
python协程+异步总结!
本文介绍了Python中的协程、asyncio模块以及异步编程的相关知识。首先解释了协程的概念和实现方法,包括greenlet、yield关键字、asyncio装饰器和async/await关键字。接着详细讲解了协程的意义和应用场景,如提高IO密集型任务的性能。文章还介绍了事件循环、Task对象、Future对象等核心概念,并提供了多个实战案例,包括异步Redis、MySQL操作、FastAPI框架和异步爬虫。最后提到了uvloop作为asyncio的高性能替代方案。通过这些内容,读者可以全面了解和掌握Python中的异步编程技术。
34 0
|
14天前
|
数据采集 缓存 程序员
python协程使用教程
1. **协程**:介绍了协程的概念、与子程序的区别、优缺点,以及如何在 Python 中使用协程。 2. **同步与异步**:解释了同步与异步的概念,通过示例代码展示了同步和异步处理的区别和应用场景。 3. **asyncio 模块**:详细介绍了 asyncio 模块的概述、基本使用、多任务处理、Task 概念及用法、协程嵌套与返回值等。 4. **aiohttp 与 aiofiles**:讲解了 aiohttp 模块的安装与使用,包括客户端和服务器端的简单实例、URL 参数传递、响应内容读取、自定义请求等。同时介绍了 aiofiles 模块的安装与使用,包括文件读写和异步迭代
18 0
|
1月前
|
数据处理 Python
深入探索:Python中的并发编程新纪元——协程与异步函数解析
深入探索:Python中的并发编程新纪元——协程与异步函数解析
26 3
|
2月前
|
Python
Python中的异步编程与协程实践
【9月更文挑战第28天】本文旨在通过一个简单易懂的示例,介绍如何在Python中利用asyncio库实现异步编程和协程。我们将通过代码示例来展示如何编写高效的并发程序,并解释背后的原理。
|
2月前
|
数据库 开发者 Python
实战指南:用Python协程与异步函数优化高性能Web应用
在快速发展的Web开发领域,高性能与高效响应是衡量应用质量的重要标准。随着Python在Web开发中的广泛应用,如何利用Python的协程(Coroutine)与异步函数(Async Functions)特性来优化Web应用的性能,成为了许多开发者关注的焦点。本文将从实战角度出发,通过具体案例展示如何运用这些技术来提升Web应用的响应速度和吞吐量。
29 1
|
2月前
|
调度 Python
揭秘Python并发编程核心:深入理解协程与异步函数的工作原理
在Python异步编程领域,协程与异步函数成为处理并发任务的关键工具。协程(微线程)比操作系统线程更轻量级,通过`async def`定义并在遇到`await`表达式时暂停执行。异步函数利用`await`实现任务间的切换。事件循环作为异步编程的核心,负责调度任务;`asyncio`库提供了事件循环的管理。Future对象则优雅地处理异步结果。掌握这些概念,可使代码更高效、简洁且易于维护。
24 1
|
2月前
|
调度 开发者 Python
探索Python中的异步编程:理解asyncio和协程
【9月更文挑战第22天】在现代软件工程中,异步编程是提升应用性能的关键技术之一。本文将深入探讨Python语言中的异步编程模型,特别是asyncio库的使用和协程的概念。我们将了解如何通过事件循环和任务来处理并发操作,以及如何用协程来编写非阻塞的代码。文章不仅会介绍理论知识,还会通过实际的代码示例展示如何在Python中实现高效的异步操作。
|
1月前
|
数据采集 调度 Python
Python编程异步爬虫——协程的基本原理(一)
Python编程异步爬虫——协程的基本原理(一)
|
1月前
|
数据采集 Python
Python编程异步爬虫——协程的基本原理(二)
Python编程异步爬虫——协程的基本原理(二)