Domanda

In python il rendimento delle parole chiave può essere utilizzato sia in push e pull contesti, io so come fare il pull contesto in c#, ma come faccio a raggiungere il push.Ho posto il codice che sto cercando di replicare in c# python:

def coroutine(func):
  def start(*args,**kwargs):
    cr = func(*args,**kwargs)
    cr.next()
    return cr
  return start

@coroutine
def grep(pattern):
  print "Looking for %s" % pattern
  try:
    while True:
      line = (yield)
      if pattern in line:
        print line,
  except GeneratorExit:
    print "Going away. Goodbye"
È stato utile?

Soluzione

Se quello che vuoi è una "collezione osservabile" - che è, una collezione che spinge i risultati a voi piuttosto che lasciare che il consumatore li tira - allora probabilmente si vuole prendere in considerazione le estensioni Framework reattivi. Ecco un articolo su di esso:

http://www.infoq.com/news/ 2009/07 / reattivi-quadro-LINQ-Events

Ora, come si nota, è possibile costruire sia "push" e "pull" iteratori stile facilmente se si dispone di coroutine disponibili. (Oppure, come sottolinea Thomas, è possibile costruire con le continuazioni pure.) Nella versione attuale di C # non abbiamo veri co-routine (o continuazioni). Tuttavia, siamo molto preoccupati per gli utenti di dolore si sentono in giro per programmazione asincrona .

Attuare coroutine a base di fibre come caratteristica linguaggio di prima classe è una tecnica che potrebbe essere usato per facilitare la programmazione asincrona, ma questo è solo uno dei possibili idea di molti che siamo attualmente ricercando. Se si dispone di un solido scenario davvero impressionante in cui coroutine fare un lavoro migliore di qualsiasi altra cosa - compreso il quadro reattivo - poi mi piacerebbe sentire di più. I dati più realistici che abbiamo su quali problemi reali le persone si trovano ad affrontare nella programmazione asincrona, più è probabile che siamo a venire con una buona soluzione. Grazie!

AGGIORNAMENTO: Abbiamo recentemente annunciato che stiamo aggiungendo flussi di controllo asincrono coroutine-come la prossima versione di C # e VB. Si può provare con la nostra edizione Community Technology Preview, che può essere scaricato qui .

Altri suggerimenti

C# non sono generale co-routine.Un generale co-routine è dove il co-routine ha il proprio stack, cioèsi può richiamare altri metodi e quei metodi in grado di "resa" dei valori.Attuazione del generale co-routine, è necessario apportare alcune cose intelligenti con le pile, possibilmente fino a e includendo l'allocazione dello stack frame (le strutture nascoste che contengono variabili locali) sul mucchio.Questo può essere fatto, alcune lingue di farlo (ad es.Regime), ma è un po ' complicato per farlo bene.Inoltre, molti programmatori trovare la funzionalità di difficile comprensione.

Generale co-routine può essere emulato con i thread.Ogni thread ha il suo stack.In un co-routine di installazione, entrambi i thread (il chiamante iniziale, e il filo per la co-routine) si alterneranno controllo, non sarà mai effettivamente eseguiti contemporaneamente.La "resa" il meccanismo è quindi uno scambio tra i due thread, e come tale è costoso (sincronizzazione, una di andata e ritorno attraverso il kernel del sistema operativo e di pianificazione...).Inoltre, c'è molto spazio per le perdite di memoria (il co-routine deve essere esplicitamente "fermato", altrimenti il thread in attesa bastone per sempre).Quindi, questo è raramente eseguita.

C# fornisce un imbastardita-down co-funzione chiamata di routine gli iteratori.Il compilatore C# converte automaticamente il codice dell'iteratore in uno specifico stato di classe, con le variabili locali diventando campi della classe.Cedendo poi, alla VM livello, una pianura return.Una cosa del genere è fattibile come la "resa" è eseguita dall'iteratore codice stesso, non è un metodo che l'iteratore il codice richiama.C# iteratori già in grado di coprire molti casi di utilizzo di C# progettisti erano disposti ad andare più in basso la strada per continuazioni.Alcuni sarcastico persone sono desiderosi di affermare che l'attuazione completa continuazioni avrebbe impedito C# da essere efficiente come il suo acerrimo nemico Java (efficiente continuazioni sono fattibili, ma questo richiede un bel po ' di lavoro con il GC e il compilatore JIT).

grazie @NickLarsen, ti ha aiutato a ricordare il nuovo materiale che la SM hanno introdotto, l'interfaccia IObservable.

http://msdn.microsoft.com /en-us/library/dd783449(VS.100).aspx

In realtà .NET non rende "presupposti errati" circa affinità di thread, in realtà totalmente disaccoppia la nozione di un filo di livello .NET dal thread livello di sistema operativo.

Quello che devi fare è associare uno stato filo .NET logica con la tua fibra (per questo è necessario il CLR Hosting API, ma non c'è bisogno di scrivere un host da soli è possibile utilizzare quelli necessari dalla propria applicazione direttamente) e tutto ciò, il monitoraggio di blocco, la gestione delle eccezioni funziona normalmente.

Un esempio può essere trovato qui: http://msdn.microsoft. com / it-it / magazine / cc164086.aspx

A proposito Mono 2.6 contiene partire supporto coroutine livello e può essere utilizzato per attuare tutte le primitive di livello superiore facilmente.

Mi piacerebbe vedere un'API a base di fibre per .Net.

Ho cercato di utilizzare l'API di fibre native in C # con P / Invoke un po 'indietro, ma perché la gestione delle eccezioni del runtime (erroneamente) formula ipotesi filo-based, le cose rotto (male) quando le eccezioni accaduto.

Un "killer application" per un coroutine API a base di fibre è programmazione del gioco; alcuni tipi di AI richiedono un filo "leggero", che è possibile il tempo-fetta a volontà. Ad esempio, gli alberi di comportamento di gioco richiedono la capacità di "Pulse" il codice di decisione ogni frame, permettendo il codice AI di cedere in modo cooperativo al chiamante quando la fetta decisione spetta. Questo è possibile implementare con fili rigidi, ma molto, molto più complicato.

Così, mentre casi d'uso alla vera fibra non sono mainstream, che sicuramente esistono, e una piccola nicchia di noi programmatori .Net sarebbe allietare potentemente se i bug esistenti nel sottosistema fibra sono state elaborate.

Bene, ho dato una prova lo sviluppo di una libreria completa per gestire coroutine con solo un singolo thread. La parte più difficile è stato quello di chiamare coroutines all'interno coroutines ... e per riportare i parametri, ma alla fine ho raggiunto un buon risultato qui . L'unica avvertenza è che bloccando le operazioni di I / O deve essere fatta tramite compiti e alll "ritorno" deve essere sostituito con "dei rendimenti". Con il server di applicazione sulla base di questa libreria ho potuto quasi il doppio delle richieste formulate con un async norma / attendono di base di IIS. (Cercate l'Node.Cs e Node.Cs.Musicstore su github per provare a casa)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top