сопрограмма, в которой мы находимсяпредыдущий постОб этом упоминалось, и теперь мы официально знакомим с основами сопрограмм.
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
Теперь наша сопрограмма вступит в силу.