Andando dal tornado.gen documentation qualcuno può aiutarmi a capire la differenza esatta tra tornado.gen.coroutine e tornado.gen.engineDifferenza di tornado.gen.engine v/s tornado.gen.coroutine
risposta
Come la documentazione tornado per gen.engine
dice:
Questo decoratore è simile a coroutine, tranne che non restituisce un futuro e l'argomento callback non è trattata in modo speciale.
E come la documentazione gen.coroutine
dice
Dal punto di vista del chiamante, @ gen.coroutine è simile alla combinazione di @return_future e @ gen.engine.
gen.engine
è fondamentalmente una versione meno recente e semplificata di ciò che fa la coroutine. Se stai scrivendo un nuovo codice, dovresti seguire i consigli della documentazione e usare sempre tornado.gen.coroutine
.
È piuttosto evidente se si guarda il codice per entrambe le funzioni (con la documentazione rimossa).
motore:
def engine(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
runner = None
def handle_exception(typ, value, tb):
if runner is not None:
return runner.handle_exception(typ, value, tb)
return False
with ExceptionStackContext(handle_exception) as deactivate:
try:
result = func(*args, **kwargs)
except (Return, StopIteration) as e:
result = getattr(e, 'value', None)
else:
if isinstance(result, types.GeneratorType):
def final_callback(value):
if value is not None:
raise ReturnValueIgnoredError(
"@gen.engine functions cannot return values: "
"%r" % (value,))
assert value is None
deactivate()
runner = Runner(result, final_callback)
runner.run()
return
if result is not None:
raise ReturnValueIgnoredError(
"@gen.engine functions cannot return values: %r" %
(result,))
deactivate()
# no yield, so we're done
return wrapper
coroutine:
def coroutine(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
runner = None
future = TracebackFuture()
if 'callback' in kwargs:
callback = kwargs.pop('callback')
IOLoop.current().add_future(
future, lambda future: callback(future.result()))
def handle_exception(typ, value, tb):
try:
if runner is not None and runner.handle_exception(typ, value, tb):
return True
except Exception:
typ, value, tb = sys.exc_info()
future.set_exc_info((typ, value, tb))
return True
with ExceptionStackContext(handle_exception) as deactivate:
try:
result = func(*args, **kwargs)
except (Return, StopIteration) as e:
result = getattr(e, 'value', None)
except Exception:
deactivate()
future.set_exc_info(sys.exc_info())
return future
else:
if isinstance(result, types.GeneratorType):
def final_callback(value):
deactivate()
future.set_result(value)
runner = Runner(result, final_callback)
runner.run()
return future
deactivate()
future.set_result(result)
return future
return wrapper
Entrambi questi sono probabilmente abbastanza difficile da capire a prima vista. Tuttavia, è ovvio che il codice è molto simile, ad eccezione del fatto che lo @gen.coroutine
ha una gestione speciale del kwarg callback
e crea/restituisce un Future
. @gen.engine
ha un codice che genera in modo specifico un errore se si tenta di restituire qualcosa da esso, anziché inserirlo in Future
.
- 1. differenza di freeglut vs glew?
- 2. Inode vs Vnode Differenza
- 3. dataset vs .data - Differenza?
- 4. Differenza di Dictionary.Add vs Dizionario [chiave] = valore
- 5. Differenza di using namespace (std :: :: vs std: :)
- 6. Differenza di LinkedList, coda vs lista
- 7. iOS - pushViewController vs presentModalViewController differenza
- 8. Seq.iter vs per - che differenza?
- 9. Differenza tra "get' VS 'getProperty'
- 10. const_cast VS mutabile? qualche differenza?
- 11. Differenza tra oracle.sql.BLOB.DURATION_CALL vs oracle.sql.BLOB.DURATION_SESSION
- 12. Differenza tra NSWindowController Vs NSViewController
- 13. differenza tra session.evict vs chiaro
- 14. Differenza tra document.hidden vs document.hasFocus()
- 15. Differenza tra DataContractSerializer vs XmlSerializer
- 16. :: tolower vs differenza std :: tolower
- 17. Differenza tra carico vs DOMContentLoaded
- 18. Qual è la differenza tra colorWithSRGBRed vs colorWithDeviceRed vs colorWithCalibratedRed
- 19. Differenza tra AlertDialog.builder's obj.create() vs obj.show() vs obj.create(). Show()
- 20. differenza tra i386: x64-32 vs i386 vs i386: x86_64
- 21. iPhone: Differenza tra nil vs Nil e vero vs TRUE
- 22. Differenza tra variabili linux $ BASH_SUBSHELL vs $ SHLVL
- 23. Display retina VS normale differenza colori display
- 24. Che differenza tra Jersey vs JAX-RS
- 25. Differenza tra :: class vs :: className() in Yii2?
- 26. Differenza tra IIS 6.0 vs IIS 7.0
- 27. javax.ws.rs.core.Cookie vs javax.ws.rs.core.NewCookie, Qual è la differenza?
- 28. node.js vs. mete.js qual è la differenza?
- 29. Asincrono vs Multithreading - C'è una differenza?
- 30. mb_strpos vs strpos, qual è la differenza?