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