2013-10-19 16 views
10

Poszedłem na spotkanie z Pythonem SF, gdy Guido talked o Tulip, przyszłej bibliotece asynchronicznej dla asynchronicznych operacji w Pythonie.Tulipan/asyncIO: dlaczego nie wszystkie połączenia mają być asynchroniczne i określić, kiedy rzeczy powinny być synchroniczne?

na wynos jest to, że jeśli chcesz coś być uruchamiany asynchronicznie można użyć "yield from" + expression i kilku dekoratorów aby określić, że wezwanie do tego, co przychodzi po yield from powinno być wykonywane asynchronicznie. Dobrą rzeczą jest to, że możesz czytać instrukcje w tej funkcji w normalny sposób (tak jakby był synchroniczny) i będzie zachowywał się tak, jakby był synchroniczny w odniesieniu do wykonywania tej funkcji (wartości zwracane i propagacja błędów/wyjątków i obsługa).

Moje pytanie brzmi: dlaczego nie mieć przeciwnego zachowania, a mianowicie, czy wszystkie wywołania funkcji są domyślnie asynchroniczne (i bez yield from) i mają inną wyraźną składnię, jeśli chcesz wykonać coś synchronicznie?

(oprócz konieczności innym kluczowym/składni SPEC)

+0

Dziękuję, doceniam to. – Gabriel

+0

@ iCodez Domyślam się, że asyncio jako nazwa standardowej biblioteki będzie używane częściej niż Tulip. Poza tym tag Tulip jest już brany pod C++. Oznaczyłem wszystkie pytania dotyczące Pythona odnoszące się do Tulip z 'python-asyncio' (zobacz' python-multithreading' dla * stanu techniki *) –

+0

try: 'sentence = tokenize_sent (your_question); random.shuffle (zdania); text = "\ n" .join (sentences) 'i zobacz, jak łatwo jest go zrozumieć lub czy znaczenie pozostaje takie samo. async domyślnie miesza kolejność: wszystkie problemy wielowątkowości prewencyjnej bez korzyści. – jfs

Odpowiedz

14

Prawdziwa odpowiedź brzmi, że Guido lubi fakt, że asynchroniczne granice plastyczności są jednoznaczne w współprogram, bo jeśli nie zdają sobie sprawy, że połączenie może wydajność, to jest zaproszenie do problemów z współbieżnością - jak z wątkami. Ale jeśli musisz napisać jednoznacznie yield from, dość łatwo jest upewnić się, że nie wyląduje w środku dwóch krytycznych operacji, które powinny wyglądać atomowo na resztę kodu.

Jak wspomina in his PyCon 2013 keynote, istnieją inne asynchroniczne struktury Pythona, takie jak Gevent, które są domyślnie asynchroniczne i nie podoba mu się to podejście. (Na 11:58):

I niestety nadal nie jesteś całkowicie wolny od problemu że planista mógł w przypadkowym momencie przerwać swoje zadanie i przełącznik na inną. [...] Dowolna funkcja, którą dziś nazywasz, że nigdy się nie zmienia, jutro ktoś może dodać instrukcję logowania lub leniwą pamięć podręczną lub konsultację pliku ustawień . [...]

11

pamiętać, że możliwości wykorzystania yield from stanowią niewielką część asynch PEP i nigdy potrzebne być używany. Może Guido wyprzedziło ich w swojej rozmowie ;-)

Co do tego, dlaczego funkcje nie są zawsze zmieniane, aby zawsze były asynchroniczne, to po prostu realizm. Asynchroniczne sztuczki przynoszą nowe koszty i komplikacje semantyczne, a Python nie zwalnia ani nie komplikuje życia, aby ułatwić pisanie kilku aplikacji.

W skrócie, „praktyczność bije czystości” ;-)

Powiązane problemy