Определение и работа сопрограмм

Python

сопрограмма, в которой мы находимсяпредыдущий постОб этом упоминалось, и теперь мы официально знакомим с основами сопрограмм.

1. Как определить сопрограмму? Суть сопрограммы все же в функции, это асинхронная функция, добавляющая функцию к обычной функцииasyncПросто отлично, так что суть сопрограммы — асинхронная функция;

2. Как работает сопрограмма? Корутины не будут запускаться при прямом использовании как обычные функции:

async def paly_game(name:str):
    print(name)
paly_game('kpl')

результат операции:

RuntimeWarning: coroutine 'paly_game' was never awaited
  paly_game('kpl')

Существующая библиотека предоставляет 3 способа запуска сопрограмм: (1) asyncio.run (асинхронная функция/сопрограмма)

async def paly_game(name:str):
    print(name)
asyncio.run(paly_game('kpl'))

(2) ожидание асинхронной функции/сопрограммы Используя await для вызова сопрограмм, мы можем увидеть пример:

async def paly_game(name:str):
    print(name)
async  def play():
    await paly_game('kpl')#调用paly_game
asyncio.run(play())

Следует отметить, что внутри функции необходимо использовать await, иначе будет сообщено об ошибке:

async def paly_game(name:str):
    print(name)
await paly_game()

результат операции:

await paly_game()
    ^
SyntaxError: 'await' outside function

(3) asyncio.create_task (асинхронная функция/сопрограмма), а затем запустите задачу

async def paly_game(name:str):
    print(name)
async def play():
    task=asyncio.create_task(paly_game('kpl'))
    await task
asyncio.run(play())

За ожиданием может следовать сопрограмма или задача сопрограммы, в чем разница между ними? Давайте посмотрим на прямую сопрограмму:

import asyncio
import time

async def paly_game(name:str,t:int):
    await asyncio.sleep(t)
    print(name)

async def play():
    start=time.time()
    await paly_game('kpl',2)
    await paly_game('kpl',3)
    print('spend total time is {}'.format(time.time()-start))
asyncio.run(play())

результат операции:

kpl
kpl
spend total time is 5.016455888748169

Мы обнаружили, что кажется, что сопрограмма вообще не действует, или 3 + 2 = 5 секунд, На самом деле только использование задачи будет сопрограммой, похожей на планирование:

import asyncio
import time

async def paly_game(name:str,t:int):
    await asyncio.sleep(t)
    print(name)
async def play():
    start=time.time()
    task1=asyncio.create_task(paly_game('kpl',2))
    task2 = asyncio.create_task(paly_game('kpl', 3))
    await task1
    await task2
    print('spend total time is {}'.format(time.time()-start))
asyncio.run(play())

результат операции:

kpl
kpl
spend total time is 2.995018243789673

Теперь наша сопрограмма вступит в силу.