2010-10-08 15 views

Odpowiedz

15

Używam inlineCallbacks do inicjalizacji wielu kroków (np. Auth) do niektórych usług, gdzie każdy kolejny krok zależy na przykład od wyniku z poprzedniego kroku, na przykład. Poza tymi sytuacjami, stwierdzam, że inlineCallbacks może prowadzić do leniwego programowania, które może zwolnić spowolnienie swojej aplikacji.

Oto przykład:

@defer.inlineCallbacks 
def some_func(): 
    res1 = yield call1() 
    res2 = yield call2() 
    ... do something with res1 and res2 ... 

Jeśli call1 i call2 są całkowicie niezależne połączenia, które chcesz parallelize, funkcja ta zakończy się szeregowania tych połączeń. Aby przekonwertować to do parallelizing zadzwonić należy:

@defer.inlineCallbacks 
def some_func_better(): 
    d1 = call1() 
    d2 = call2() 
    res1 = yield d1 
    res2 = yield d2 

ten sposób można uzyskać call1 i call2 działa równocześnie, ale trzeba czekać na wyniki, ponieważ pochodzą one w Tak więc, choć jest to możliwe, aby uzyskać te same korzyści z. Odsetki akcji, wydaje się, że zbyt łatwe jest zaimplementowanie poprzedniego rozwiązania.

Pamiętaj, że nadal musisz owijać bloki try...except wokół wszystkich wywołań rentowności, ponieważ są one jedynym sposobem łapania błędów w kodzie (chyba że funkcja wywołania funkcji inlineCallbacks obsługuje anulowanie poziom).

Więc uważam, że to naprawdę nie jest kwestia wydajności per se, ale raczej dobrych nawyków, które pozwoliłoby mi odradzają inlineCallbacksw ogólnym - są nadal świetne dla szybkich fragmentów kodu, inicjalizacji wielostopniowe procedury lub testy na przykład.

+0

Zaskakująco 'inlineCallbacks' nie obsługuje' cancel() '. Musiałem kiedyś przepisać kilka gotowych do odczytu funkcji na niechlujne konstrukcje zagnieżdżonych wywołań zwrotnych, ponieważ potrzebowałem możliwości "anulowania()" procesu. – Stefan

2

Różnice powinny być naprawdę subtelne. Jeśli ten kod naprawdę działa tak często, że ma to znaczenie, być może powinieneś zajrzeć do swojego projektu aplikacji. W przeciwnym razie, wybierz wariant, który jest łatwiejszy do odczytania, musisz zrobić z niego głowy i ogony kilka miesięcy lub lat w dół drogi.

EDYCJA: Jeśli naprawdę chcesz wiedzieć, oto jak się dowiesz (może to być w końcu implementacja specyficzna dla twojej wersji Pythona): uruchom obie wersje w ciasnej pętli i zmierz czas. Zwiększ liczbę pętli, aż różnica czasu między wersjami będzie znacznie większa niż wariancja czasu tej samej wersji w wielu seriach. Powtórz po zmianie wersji Pythona, OS itd.

+0

Bardziej przydatne jest wykonanie tego testu na własnym kodzie aplikacji, ponieważ zależy od sposobu ich użycia. – Glyph

0

użytku defer.inlineCallbacks może kody easiler czytać ..

i jakoś jak corountine stylu: ty ani blokować połączenia ani używać łańcuch wywołań zwrotnych zbudować całą logikę. Jest intuicyjny.