IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> [python]异步 async -> 正文阅读

[Python知识库][python]异步 async

# -*- encoding: utf-8 -*-
"""ankus 
@Modify Time      @Author    @Version    @Description
------------      -------    --------    -----------
2021/12/3 14:02   xlgui2      1.0       asyncio   py3.8

异步IO:就是发起一个IO操作(如:网络请求,文件读写等),这些操作一般是比较耗时的,不用等待它结束,可以继续做其他事情,结束时会发来通知。
协程:又称为微线程,在一个线程中执行,执行函数时可以随时中断,由程序(用户)自身控制,执行效率极高,与多线程比较,没有切换线程的开销和多线程锁机制。

# 重要的概念
1.事件循环
管理所有的事件,在整个程序运行过程中不断循环执行并追踪事件发生的顺序将它们放在队列中,空闲时调用相应的事件处理者来处理这些事件。

2.Future
Future对象表示尚未完成的计算,还未完成的结果

3.Task
是Future的子类,作用是在运行某个任务的同时可以并发的运行多个任务。
asyncio.Task用于实现协作式多任务的库,且Task对象不能用户手动实例化,通过下面2个函数创建:
    asyncio.async()
    loop.create_task() 或 asyncio.ensure_future()


run_until_complete():
阻塞调用,直到协程运行结束才返回。参数是future,传入协程对象时内部会自动变为future

asyncio.sleep():
模拟IO操作,这样的休眠不会阻塞事件循环,前面加上await后会把控制权交给主事件循环,在休眠(IO操作)结束后恢复这个协程。
若在协程中需要有延时操作,应该使用 await asyncio.sleep(),而不是使用time.sleep(),因为使用time.sleep()后会释放GIL,阻塞整个主线程,从而阻塞整个事件循环。
"""
import asyncio


async def coroutine_example():
    print("start")
    await asyncio.sleep(1)
    print("end")


coro = coroutine_example()
print("get event loop")
loop = asyncio.get_event_loop()
"""Run the event loop until a Future is done."""
loop.run_until_complete(coro)  # 阻塞调用,直到协程运行结束才返回。
print("over")
loop.close()
# -*- encoding: utf-8 -*-
"""ankus 
@Modify Time      @Author    @Version    @Description
------------      -------    --------    -----------
2021/12/3 14:09   xlgui2      1.0         async 创建task

# 创建Task
loop.create_task():

接收一个协程,返回一个asyncio.Task的实例,也是asyncio.Future的实例,毕竟Task是Future的子类。返回值可直接传入run_until_complete()

返回的Task对象可以看到协程的运行情况
"""
import asyncio


async def coroutine_example():
    print("start1")
    await asyncio.sleep(1)
    print('end1')
    return 1


async def coroutine_example2():
    print("start2")
    await asyncio.sleep(1)
    print('end2')
    return 2

loop = asyncio.get_event_loop()

coro = coroutine_example()
coro2 = coroutine_example2()

task = loop.create_task(coro)
task2 = loop.create_task(coro2)
print('运行情况1:', task)
print('运行情况2:', task2)

loop.run_until_complete(task)


print('再看下运行情况1:', task)
print('再看下运行情况2:', task2)

loop.close()

# -*- encoding: utf-8 -*-
"""ankus 
@Modify Time      @Author    @Version    @Description
------------      -------    --------    -----------
2021/12/3 14:21   xlgui2      1.0         获取协程返回值

有2种方案可以获取返回值。

第1种方案:通过task.result()

可通过调用 task.result() 方法来获取协程的返回值,
但是只有运行完毕后才能获取,若没有运行完毕,result()方法不会阻塞去等待结果,
而是抛出 asyncio.InvalidStateError 错误

第2种方案:通过add_done_callback()回调

"""

import asyncio

##########################################################################
# ## 第1种方案:通过task.result()
"""
async def coroutine_example():
    await asyncio.sleep(1)
    return 1


loop = asyncio.get_event_loop()
coro = coroutine_example()

task = loop.create_task(coro)
print('运行情况:', task)
try:
    print('返回值:', task.result())
except asyncio.InvalidStateError:
    print('task状态未完成,捕获了 InvalidStateError 异常')

loop.run_until_complete(task)
print('再看下运行情况:', task)
print('返回值:', task.result())
loop.close()

"""


##########################################################################

# ##第2种方案:通过add_done_callback()回调

def my_callback(future):
    print('返回值:', future.result())


async def coroutine_example():
    print("start")
    await asyncio.sleep(1)
    print("end")
    return 1


loop = asyncio.get_event_loop()
coro = coroutine_example()
task = loop.create_task(coro)
task.add_done_callback(my_callback)

loop.run_until_complete(task)
loop.close()

# -*- encoding: utf-8 -*-
"""ankus 
@Modify Time      @Author    @Version    @Description
------------      -------    --------    -----------
2021/12/3 14:46   xlgui2      1.0         控制任务
通过asyncio.wait()可以控制多个任务

asyncio.wait()是一个协程,不会阻塞,立即返回,返回的是协程对象。
传入的参数是future或协程构成的可迭代对象。最后将返回值传给run_until_complete()加入事件循环
"""

import asyncio


async def coroutine_example(name):
    print('正在执行name:', name)
    await asyncio.sleep(3)
    print('执行完毕name:', name)


loop = asyncio.get_event_loop()

tasks = [coroutine_example('task_' + str(i)) for i in range(9)]  # 由协程构成的可迭代对象
wait_coro = asyncio.wait(tasks)
loop.run_until_complete(wait_coro)
loop.close()

# -*- encoding: utf-8 -*-
"""ankus 
@Modify Time      @Author    @Version    @Description
------------      -------    --------    -----------
2021/12/3 15:54   xlgui2      1.0         多任务中获取返回值

方案1:需要通过loop.create_task()创建task对象,以便后面来获取返回值
方案2:通过回调add_done_callback()来获取返回值
"""

# 下面代码asyncio.wait()中,参数传入的是由future(task)对象构成的可迭代对象


##############################################
# 方案1:需要通过loop.create_task()创建task对象,以便后面来获取返回值
"""
import asyncio


async def coroutine_example(name):
    print('正在执行name:', name)
    await asyncio.sleep(1)
    print('执行完毕name:', name)
    return '返回值:' + name


loop = asyncio.get_event_loop()

tasks = [loop.create_task(coroutine_example('Zarten_' + str(i))) for i in range(3)]
wait_coro = asyncio.wait(tasks)
loop.run_until_complete(wait_coro)

for task in tasks:
    print(task.result())

loop.close()
"""

########################
# 方案2:通过回调add_done_callback()来获取返回值
import asyncio


def my_callback(future):
    print('返回值:', future.result())


async def coroutine_example(name):
    print('正在执行name:', name)
    await asyncio.sleep(1)
    print('执行完毕name:', name)
    return '返回值:' + name


loop = asyncio.get_event_loop()

tasks = []
for i in range(3):
    task = loop.create_task(coroutine_example('Zarten_' + str(i)))
    task.add_done_callback(my_callback)
    tasks.append(task)

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

loop.close()


更多
https://mp.weixin.qq.com/s/nW8pa1qYgBtGxolMWYH6kA

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-12-04 13:24:12  更:2021-12-04 13:26:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 2:31:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码