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?
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 await
ing, 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.
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