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 ...')
Ще немає коментарів