Python 3.5 буде підтримувати Async/Await асинхронне програмування

2 хв. читання

Python 3.5 отримає підтримку співпрограм з async та await синтаксисом, відповідно до Python Enhancement Proposal (PEP) #0492. Цей PEP направлений на те, щоб зробити співпрограми нативними в Python та "створити загальну, легко доступну, ментальну модель асинхронного програмування."

Ось такий вигляд матиме новий синтаксис для співпрограм:

async def read_data(db):
    pass

Зокрема, ключове слово async змушує функцію вести себе як співпрограма, навіть якщо вона не містить ключового слова await. Така функція буде повертати об'єкт співпрограми при виконанні.

Всередині тіла співпрограми ключове слово await може бути використано щоб призупинити виконання та чекати обробки:

async def read_data(db):
    data = await db.fetch('SELECT ...')
    ...

Співпрограми вже давно доступні в Python завдяки генераторам, тобто генератори розглядаються як співпрограми коли вислів yield або yield from присутній в тілі генератора.

Приклад використання генератора:

>>> def createGenerator():
...    mylist = range(3)
...    for i in mylist:
...        yield i*i
...
>>> mygenerator = createGenerator()
>>> for i in mygenerator:
...     print(i)
0
1
4

В коді вище, кожен раз, коли з циклі викликається генератор, він повертає нове значення.

Більше прикладів з використання await можна знайти в PEP #0492.

Нова форма співпрограми має на меті чітко відокремити генератори від співпрограм, з очікуваними вигодами:

  • зробити їх легшими для розробників-початківців;

  • усунути причину "неочевидних помилок" у зв'язку з ненавмисним видаленням yield з підпрограми під час рефакторингу, через що підпрограма розглядалася як генератор.

async/await синтаксис дозволяє розробникам писати код, ніби він є послідовним, але компілятор буде здійснювати його через послідовність співпрограми, що робить його ефективним. Повернемося до попереднього прикладу, async/await дозволяє послідовно робити декілька await:

async def read_data(db):
    data = await db.fetch('SELECT ...')
    if (data...)
        await api.send(data ...')
Помітили помилку? Повідомте автору, для цього достатньо виділити текст з помилкою та натиснути Ctrl+Enter
Codeguida 5.7K
Приєднався: 8 місяців тому
Коментарі (0)

    Ще немає коментарів

Щоб залишити коментар необхідно авторизуватися.

Вхід / Реєстрація