Coroutine vs vs Devamı Jeneratör
Bir coroutine ve devamı ve jeneratör arasındaki fark nedir ?
CEVAP
Jeneratörler, en basit bir dava olarak görmeye başlayacağım. @Zvolkov belirtildiği gibi, tekrar tekrar dönmeden denilen nesne/fonksiyonları ediyorlar, ama aradığında (verim) bir değer döndürür ve bunların faaliyetlerini askıya sonra. Tekrar deniyor, Onlar son askıya alınmış ve olanları bir yerden tekrar başlayacak.
Bir jeneratör aslında kısmak (asimetrik) bir coroutine. Coroutine ve jeneratör arasındaki farkı bir coroutine başlangıçta, bir jeneratör ise denir oldu sonra bağımsız değişkenleri kabul edemez.
Biraz yukarı coroutines kullanmak istiyorum nereye önemsiz bir örnek için zor, ama burada benim en iyi deneyin. Örnek olarak () bu Python kodu.
def my_coroutine_body(*args):
while True:
# Do some funky stuff
*args = yield value_im_returning
# Do some more funky stuff
my_coro = make_coroutine(my_coroutine_body)
x = 0
while True:
# The coroutine does some funky stuff to x, and returns a new value.
x = my_coro(x)
print x
Coroutines kullanıldığı bir örnek lexers ve ayrıştırıcıları. Coroutines dilinde ya da bir şekilde taklit olmadan, lexing ve ayrıştırma kod gerçekten iki ayrı endişeleri olmalarına rağmen birlikte karışık olması gerekir. Ama bir coroutine kullanarak, lexing ve ayrıştırma kodu ayırabilirsiniz.
(Simetrik ve asimetrik coroutines arasındaki farkı fırça için gideceğim. Bu eşdeğer olduklarını söylemek yeterlidir, birinden diğerine dönüştürebilirsiniz, ve çoğu gibi jeneratörleri--olan asimetrik coroutines--anlamak daha kolay. Bir Python asimetrik coroutines uygulamak nasıl anahat.
Devamı için aslında oldukça basit hayvanlardır. Hangi fonksiyonları program içinde başka bir nokta temsil ediyorlar, eğer ararsan, yürütme otomatik olarak bu işlevi temsil eder noktasını geçmek için neden olacaktır. Farkında bile olmadan çok sınırlı sürümleri her gün kullanın. İstisnalar, örneğin, ınside out devamı olarak düşünülebilir. Sana bir devamı Python tabanlı yalancı bir örnek vereyim.
Söyle bir Python fonksiyonu callcc()
, aradı ve bu fonksiyon iki argüman aldı, ilk bir fonksiyon olmak, ve ikinci çağrı için bağımsız değişken listesi. Bu işlev sadece kısıtlanması gereken en son bağımsız değişken bir işlev mevcut devamı olacak olan) olacak.
def foo(x, y, cc):
cc(max(x, y))
biggest = callcc(foo, [23, 42])
print biggest
Ne olacağını o callcc()
olur geri arama foo()
halen mevcut ve devamı (cc
), yani bir referans noktası programı callcc()
idi. foo()
çağrıları mevcut devamı, aslında aynı olarak söylüyorum callcc() dönüş değeri arayacaksın mevcut devamı ile, ve zaman yok, onu geri alır yığını için geçerli devamı oluşturuldu, yani, ne zaman aradın callcc()
.
Tüm bunların sonucu varsayımsal Python bizim varyant baskı olacak '42'.
Umarım yardımcı olmuştur, ve benim açıklamam biraz üzerinde geliştirilebilir eminim!
Satır python liste üreteçleri veya jen...
Nasıl bir satır sonu (line devamı) Pyt...
PHP rastgele dize jeneratör...
Rastgele Dize Jeneratör Dönen Aynı Diz...
Neden MongoDB Java driver rastgele bir...