Czy istnieje jakikolwiek powód, aby używać jednego nad drugim?Twisted Deferred.addCallBack() vs. yield i @inlineDeferred
Czy mają takie same wyniki?
Czy istnieje jakikolwiek powód, aby używać jednego nad drugim?Twisted Deferred.addCallBack() vs. yield i @inlineDeferred
Czy mają takie same wyniki?
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ą inlineCallbacks
w ogólnym - są nadal świetne dla szybkich fragmentów kodu, inicjalizacji wielostopniowe procedury lub testy na przykład.
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.
Bardziej przydatne jest wykonanie tego testu na własnym kodzie aplikacji, ponieważ zależy od sposobu ich użycia. – Glyph
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.
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