Quando usare la coroutine sul generatore?

2

L'elaborazione della pipeline dei dati può essere effettuata sia,

utilizzando i generatori solo

Generatorediesempionellapipeline:

defgrep(source,pattern=None):patternObject=re.compile(pattern)forlineinsource:ifpatternObject.search(line):yieldline

o

utilizzandolecoroutinesolo

Esempiodicoroutineinpipeline:

@coroutinedefgrep(pattern):print"Looking for %s" % pattern
   while True:
      line = (yield)
      if pattern in line:
         print line,

I generatori possono essere usati per multiplexare dati da più fonti, usando thread.

Igeneratoripossonoessereutilizzatipertrasmetteredatiapiùutenti.

I generatori sono ugualmente potenti nella programmazione simultanea

Domanda:

Perché abbiamo bisogno di couroutine usando send() (per es: python)? Quando usare la coroutine sul generatore?

    
posta user1787812 11.07.2017 - 21:58
fonte

1 risposta

6

Coroutines sono generatori - hanno solo il capacità extra di ricevere argomenti dopo l'invocazione.

Le pipeline di dati (materiale ETL) sono un cattivo esempio per mostrare i loro punti di forza. Le pipeline richiedono raramente la piena potenza delle coroutine - i dati sono statici e immutabili e non richiedono modifiche dinamiche al di fuori del contesto dei dati e della funzione di incapsulamento.

Tuttavia, ci sono certamente buoni motivi per usare una coroutine. Due esempi:

  1. Iniezione dinamica di nuovi contesti : hai più richieste di server in entrata da gestire e vuoi evitare un modello di processo per richiesta a la Apache. L'intercalare delle coroutine l'una sopra l'altra e passare nel contesto della richiesta (cookie, sessioni, ecc.) In punti arbitrari ti consente di ottenere il vantaggio di un modello N: M di processo per richiesta e valutare dinamicamente le richieste utilizzando la nuova configurazione che può essere fornita ad intervalli ad hoc.

  2. Comunicazione tra i generatori : hai organizzato la tua architettura in modo peer, in cui ogni generatore deve parlare all'altro in qualche modo. Forse stai cercando di coordinarti tra le coroutine per risparmiare sulle risorse, per esempio, o forse vuoi usare gli orologi vettoriali di Lamport piuttosto che una chiamata a time.time() . Un generatore puro può solo restituire valori, ma non accettare nuove configurazioni o valori di input - una lattina di coroutine.

Ogni volta che hai bisogno di questa abilità, le coroutine sono utili!

    
risposta data 11.07.2017 - 22:25
fonte

Leggi altre domande sui tag