协程&异步编程&asyncio

协程&异步编程&asyncio

1.项目示例

1.1在python3.7 之前的版本

主要为

asyncio.ensure_future() 实例化task

使用

loop = asyncio.get_event_loop()

done, deping = loop.run_until_complete(asyncio.wait(tasks, timeout=4))

来运行

import asyncio

async def run():
    print("hello")
    await asyncio.sleep(5)
    print("world")

async def run1():
    print("hello")
    await asyncio.sleep(3)
    print("world")

# 创建并发
tasks = [asyncio.ensure_future(run()), asyncio.ensure_future(run1())]
# 创建应用池
loop = asyncio.get_event_loop()
# done 完成的
# deping 未完成的
# timeout 最长等带时间
done, deping = loop.run_until_complete(asyncio.wait(tasks, timeout=4))
print("done:", done)
print("deping:", deping)
hello
hello
world
done: {<Task finished name='Task-2' coro=<run1() done, defined at c:\Users\Administrator\Desktop\exam\协程\旧的版本.py:8> result=None>}
deping: {<Task pending name='Task-1' coro=<run() running at c:\Users\Administrator\Desktop\exam\协程\旧的版本.py:5> wait_for=<Future pending cb=[<TaskWakeupMethWrapper object at 0x000001EF104A8040>()]>>}

1.2.在python3.7 之后

将 手动创建 task 和 运行方式进行了修改

使用: async.create_task() 来创建task 实例

使用 : asyncio.run() 来运行

示例:

import asyncio

async def run():
    print("hello")
    await asyncio.sleep(2)
    print("world")
    return 1

async def run1():
    print("hello")
    await asyncio.sleep(5)
    print("world")
    
# 主函数
async def main():
    # 创建task, name 任务名称
    tasks = [ asyncio.create_task(run(), name="n1"), 
             asyncio.create_task(run(), name="n2")]
    # done 已完成的
    # pending 未完成的
 	# 这一步主要是为了执行 tasks 里的---> 等待 task里的任务
    done, pending =  await asyncio.wait(tasks, timeout=None)
    return done, pending

# 运行
done, pending = asyncio.run( main() )
print("done:", done)
print("pending:", pending)
C:\Users\Administrator\Desktop\exam>C:/Python39/python.exe "c:/Users/Administrator/Desktop/exam/协程/1. 简单示例3.4后.py"
hello
hello
world
world
done: {<Task finished name='n1' coro=<run() done, defined at c:\Users\Administrator\Desktop\exam\协程\1. 简单示例3.4后.py:3> result=1>, <Task finished name='n2' coro=<run() done, defined at c:\Users\Administrator\Desktop\exam\协程\1.  
简单示例3.4后.py:3> result=1>}
pending: set()

2.await ----->等待

​ await + 可等待对象 (协程对象, Future 对象, Task 对象) ---> IO 等待

携程对象: ----> async 修饰的函数 + ()

​ 流程:

​ 如果有其他任务, 在遇到IO等待(await) 的时候去执行其他任务。

示例1:

import asyncio

async def other():
    print("hello")
    await asyncio.sleep(3)
    print("world")
    return "返回值"
asyncio.run(other())

hello
world

示例2:

import asyncio

async def other():
    print("hello")
    await asyncio.sleep(3)
    print("world")
    return "返回值"


async def func():
    print("执行协程函数内部代码")
    #respone = await func()
    task = asyncio.create_task(other())
    print("执行结束")

asyncio.run(func())

结果:

执行协程函数内部代码
执行结束
hello

在这里我们发现, 我们开始执行协程内部代码遇到内部的await 并没有等,而是直接结束了,

示例3:

import asyncio

async def other():
    print("hello")
    await asyncio.sleep(3)
    print("world")
    return "返回值"


async def func():
    print("执行协程函数内部代码")
    respone = await other()
    print("执行结束")

asyncio.run(func())

执行协程函数内部代码
hello
world
执行结束

我们发现这样只有等内部结束后才会执行,外部接下来的代码

示例4:

import asyncio

async def other():
    print("hello")
    await asyncio.sleep(3)
    print("world")
    return "返回值"

async def other2():
    print("other---->开始")
    await asyncio.sleep(5)
    print("other ----> 结束")

async def func():
    print("执行协程函数内部代码")
    respone = await other()
    respone2 = await other2()
    print("执行结束")

asyncio.run(func())

执行协程函数内部代码
hello
world
other---->开始
other ----> 结束
执行结束

同样, await 结束后才执行下一个

3.task

​ 在事件循环中并发的添加多个任务的。可以说解决了上面的 await 的问题。

1. 使用asyncio.create_tak()  创建 3.7 之后, 建议
2. loop.create_task() 或者 asyncio.ensure_future() 来创建
async def run():
    print("hello")
    await asyncio.sleep(2)
    print("world")
    return 1

async def run1():
    print("hello")
    await asyncio.sleep(5)
    print("world")
    
    
tasks = [run(), run1()]
done, pending = asyncio.run( asyncio.wait(tasks) )
print("done:", done)
print("pending:", pending)
import asyncio

async def run():
    print("hello")
    await asyncio.sleep(2)
    print("world")
    return 1

async def run1():
    print("hello")
    await asyncio.sleep(5)
    print("world")
    
# 主函数
async def main():
    # 创建task, name 任务名称
    tasks = [ asyncio.create_task(run(), name="n1"), 
             asyncio.create_task(run(), name="n2")]
    # done 已完成的
    # pending 未完成的
 	# 这一步主要是为了执行 tasks 里的---> 等待 task里的任务
    done, pending =  await asyncio.wait(tasks, timeout=None)
    return done, pending

# 运行
done, pending = asyncio.run( main() )
print("done:", done)
print("pending:", pending)

4. asyncio.Future 对象

他是 task 的基类,

Task 继承 Future, Task 对象内部 await 结果的处理基于Future 对象来的。

5. concurrent.futures.Future 对象

使用线程池、进程池实现异步操作时用到的对象。

上一篇:LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443 解决方法


下一篇:数据库WMI 0x80041010 如何解决?