PEP 0492-ключевое слово Python 3.5 async
PEP 0492 добавляет async
ключевое слово для Python 3.5.
как Python выигрывает от использования этого оператора? Пример, который приведен для корутины, -
async def read_data(db):
data = await db.fetch('SELECT ...')
согласно документам, это достигает
приостановить [ing] выполнение функции read_data до БД.принести ожидаемый объект завершает и возвращает данные результата.
это async
ключевое слово фактически включает создание новых потоков или возможно, использование существующего зарезервированного асинхронного потока?
в случае async
использует зарезервированный поток, это один общий поток каждый в своем собственном?
1 ответов
нет, совместные процедуры не включают в себя какие-либо потоки. Совместные процедуры позволяют кооператива многозадачность в том, что каждая совместная процедура дает контроль добровольно. С другой стороны, потоки переключаются между блоками в произвольных точках.
до Python 3.4 можно было писать совместные подпрограммы с помощью генераторы С помощью yield
или yield from
выражения в теле функции создается объект генератора, где код выполняется только при перебрать генератор. Вместе с дополнительными библиотеками цикла событий (например,asyncio
) вы могли бы написать подпрограммы, которые сигнализировали бы циклу событий, что они будут заняты (возможно, ожидая ввода-вывода), и что в то же время можно запустить другую подпрограмму:
import asyncio
import datetime
@asyncio.coroutine
def display_date(loop):
end_time = loop.time() + 5.0
while True:
print(datetime.datetime.now())
if (loop.time() + 1.0) >= end_time:
break
yield from asyncio.sleep(1)
каждый раз, когда вышеуказанный код переходит к yield from asyncio.sleep(1)
line, цикл событий свободен для запуска другой совместной процедуры, потому что эта процедура ничего не будет делать в течение следующей секунды в любом случае.
поскольку генераторы могут использоваться для всех видов задач, а не только для совместных процедур, и поскольку написание совместной процедуры с использованием синтаксиса генератора может сбивать с толку новичков, PEP вводит новый синтаксис, который делает его яснее что вы пишете совместную программу.
при реализации ОПТОСОЗ приведенный выше пример может быть записан как:
async def display_date(loop):
end_time = loop.time() + 5.0
while True:
print(datetime.datetime.now())
if (loop.time() + 1.0) >= end_time:
break
await asyncio.sleep(1)
в результате coroutine