LINUX.ORG.RU

Пример в книге не работает asyncio

 , ,


0

0

До появления ключевых слов async и await в версии Python 3.5 связь между сопрограммами и генераторами была очевидной. Чтобы разо- браться в ней, напишем простую сопрограмму, которая спит в тече- ние 1 с, применив старый синтаксис с декораторами и генераторами. Листинг 14.5 Сопрограммы на основе генераторов

import asyncio
@asyncio.coroutine
    def coroutine():
        print('Засыпаю!')
        yield from asyncio.sleep(1)
        print('Проснулась!')
        asyncio.run(coroutine())

Вместо ключевого слова async мы применили декоратор @asyncio. coroutine, который говорит, что функция является сопрограммой, а вместо ключевого слова await – конструкцию yield from, знакомую по использованию генераторов. В современных версиях ключевые слова async и await – не более чем синтаксический сахар, обертываю- щий эту конструкцию.

В https://docs.python.org/3.10/library/asyncio-task.html#generator-based-coroutines

Deprecated since version 3.8, will be removed in version 3.11: Use async def instead.

async def func(param1, param2):
    do_stuff()
    await some_coroutine()
import asyncio
async def coroutine():
    print('Sleeping!')
    yield from asyncio.sleep(1)
    print('Finished!')
    await coroutine()


asyncio.run(coroutine())

out:

./project.py
  File "/project.py", line 1011
    yield from asyncio.sleep(1)
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^
SyntaxError: 'yield from' inside async function

Как переделать этот пример, чтобы он работал? Обрабатываю книгу, перезабиваю все примеры

★★★

Твоя книга ООООЧЕНЬ устарела. Асинкио через генераторы работала давным давно, сейчас там все по-другому. Советую взять другую книгу

Aswed ★★★★★
()