asyncio

3.1事件循环

理解成为一个死循环,去检测并执行某些代码。

仿代码
任务列表-【任务1。任务2。任务3.]
while True:
      可执行的任务列表,已完成的任务列表 = 去任务列表中检查所有的任务,将"可执行" 和 "已完成"的任务返回
      for就绪任务  in可执行的任务列表:
            执行已就堵旳任务

      for已完成的任务 in已完成任务列表:
            在任务列表中移除已完成任务

      如果任务列表中的任务都已完成,则终止循环
import asyncio
# 去生成或获取一个事件循环
loop = asyncio.get_event_loop()

# 将任务放到"任务列表"
loop.run_until_complete(任务)

3.2快速上手

协程函致,定义函数时候async def 函数名
协程对象,抗行协程纽数D得到的协程对象。
async def funcO:
pss
result - funco
注意;执行协程函致刨建协程对象,函数内郎代码不会执行。
如果想要运行协程函数内部代码,必须要将协程对象交给事件循环来处理

import asyncio
async def func():
      print("回家吃饭了")
result = func()
# 1oop = asyncio.get_event_loop()
# loop.run_unti_complete(result)  # 通用的
asyncio.run(result)    # 以上两句可以简写成一句     python3.7才有的简写

3.3 await

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

import asyncio
async def func():
      print("来玩")
      respomse = await asyncio.sleep(2)
      print("结束",response)
asyncio.run( func())

示例2:

import asyncio
async def others():
      print("start")
      await asyncio.sleep(2)
      print("end")
      return "返回值"

async def func():
      print("执行协程函数内部代码")
      # 遇到1O操作挂起当前协程(任务),等IO操作完成之后再继续往下执行。当前协程挂起时,事件循环可以去执行其它协程(任务)
      response = await others()
      print("IO请求结来,结果为:",response)
asyncio.run(func())

示例3:

import asyncio
async def others():
      print("start")
      await asyncio.sleep(2)
      print("end")
      return "返网值"

async def func():
      print("执行协程函数内部代码")
      # 遇到1o操作挂起当前协程(任务), 等1O操作完成之后再继续往下纨行。当前协程挂起时,事件循环可以么执行其它协程(任务).
      response1 =  await othtrs()
      print("io请求结果。response1结果为", response1)
      
      response2 = await othtrs()
      print("io请求结果。response2结果为", response2)
asyncio.run(func())

# await就是等待对象的值得到结果之后再继续向下处走。

白话:在事件循还中添加多个任务的。
Tasks用于并发调度协程,通过asyncio.create_task(协程对象)的方式创建Task对象,这样可以让协程加入事件循环中等待被调度执行。
除了使用asyncio.create_task()函数以外。还可以用低层级的loop.create_task( )或 ensure_future() 函效。不建议手动实例化Task对象。

注意;asyncio.create_task() 函数在Python3.7中被加入。在Python 3.7之前,可以改用低层级的asyncio.ensure_future()函数.

示例1:

import asymcio
async def func():
      print(1)
      amait asyncio.sleep(2)
      print(1)
      return "返回值"

async def main():
      print("main开始")
      task1 = asyncio.create_task(func()))
      task2 = asyncio.create_task(func()))
      print("main结束")
      
      # 当执行某协程遭遇IO操作时,会自动化切换执行其他任务.
      # 此处await是等待相对应的协程全都执行完毕并获取结果
      ret1 = await task1
      ret2 = await task2
      print(ret1. ret2

asyncio.run(main())

示例2:

import asyncio
async def func():
      print(1)
      await asyncio.sleep(2)
      print(2)
      return "返密值"

async def main():
    print("main开始")
    task_1ist = [
        asyncio.create task(func()),
        asyncio.create task(func())
      ]
    print("main结束了")
    done.pending = await asyncio.wait(task_1ist.timecut=None)
    print(done)
asyncio.run(main())

示例3:

import asyncio
async def func():
    print(1)
    await asyncio.sleep(2)
    print(2)
    return "返需值"

    task_1ist =[
        func(),
        func()
      ]
done.pending = asyncio.run(asyncio.await(task_list))
print(done)
posted @ 2021-01-14 17:20  ty1539  阅读(77)  评论(0编辑  收藏  举报