PEP 0492-Python 3.5 asynchroniczne słowo kluczowe

PEP 0492 dodaje słowo kluczowe async do Pythona 3.5.

W Jaki Sposób Python korzysta z tego operatora? Przykład, który jest podany dla koroutine jest

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

Według docs to osiąga

Zawiesza [ing] wykonanie read_data do db.fetch awaitable uzupełnia i zwraca dane wyniku.

Czy to słowo kluczowe async faktycznie wiąże się z tworzeniem nowych wątków lub być może z użyciem istniejącego zarezerwowanego asynchronicznego wątek?

W przypadku, gdy async używa zastrzeżonego wątku, Czy Jest to pojedynczy wspólny wątek, każdy w swoim własnym?

Author: Martijn Pieters, 2015-07-08

1 answers

Nie, procedury współbieżne nie obejmują żadnego rodzaju wątków. Ko-rutyny pozwalają na kooperację wielozadaniowość w tym, że każda Ko-rutyna daje kontrolę dobrowolnie. Wątki z drugiej strony przełączają się między jednostkami w dowolnych punktach.

Aż do Pythona 3.4, możliwe było pisanie Ko-procedur przy użyciu generatorów ; używając wyrażeń yield lub yield from w ciele funkcji tworzysz obiekt generatora, w którym kod jest wykonywany tylko wtedy, gdy iteracja odbywa się nad generatorem. Wraz z dodatkowymi bibliotekami pętli zdarzeń (takimi jak asyncio) możesz napisać co-procedury, które sygnalizowałyby pętli zdarzeń, że będą zajęte (być może czekają na I / O) i że w międzyczasie może zostać uruchomiona inna co-rutyna:

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)

Za każdym razem, gdy powyższy kod przechodzi do linii yield from asyncio.sleep(1), pętla event może dowolnie uruchamiać inną procedurę współbieżną, ponieważ ta procedura i tak nic nie zrobi przez następną sekundę .

Ponieważ generatory mogą być używane do różnego rodzaju zadań, a nie tylko do Ko-rutyny, a ponieważ pisanie co-rutyny przy użyciu składni generatora może być mylące dla nowych użytkowników, PEP wprowadza nową składnię, która sprawia, że jest jaśniejsze , że piszesz co-rutynę.

Z zaimplementowanym PEP, powyższa próbka może być zapisana jako:

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)

Wynik coroutine obiekt nadal potrzebuje pętli zdarzeń do kierowania obiema procedurami; pętla zdarzeń będzie await dla każdej z obiegów w turn, który wykona te procedury, które nie są obecnie awaiting, aby coś ukończyć.

Zaletą jest to, że z natywnym wsparciem można również wprowadzić dodatkową składnię do obsługi asynchronicznych menedżerów kontekstu i iteratorów. Wejście i wyjście z menedżera kontekstu lub zapętlenie iteratora może stać się więcej punktów w Twojej procedurze kooperacyjnej, które sygnalizują, że inny kod może być uruchomiony, ponieważ coś znowu czeka.

 42
Author: Martijn Pieters,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-13 16:05:26