2009-12-24 21 views
8

Vorrei avviare un nuovo progetto server di rete in un linguaggio che supporti la concorrenza attraverso le fibre coroutine, ovvero i thread in modalità utente. Determinare quali sono esattamente le mie opzioni è stato estremamente difficile in quanto il termine "coroutine" sembra essere usato abbastanza genericamente per indicare una varietà di cose, e "fiber" è usato quasi esclusivamente in riferimento all'API Win32.Linguaggi di scripting che supportano fibre/coroutine?

Ai fini della presente domanda, coroutine/fibre:

  • metodi di supporto che interrompono l'esecuzione cedendo seguito alla funzione di chiamata all'interno di una funzione nidificata (cioè arbitrariamente profondità nello stack di chiamate da dove la coroutine/fiber stato richiamato)
  • supporto trasferire il controllo a un'altra coroutine arbitraria nel suo punto corrente di esecuzione (cioè resa a un coroutine che non chiamare il coroutine)

quali sono le opzioni lingua S? So che Ruby 1.9 e Perl (Coro) hanno entrambi supporto, cos'altro? Qualche cosa con una gc matura e un'invocazione di metodo dinamica è sufficiente.

risposta

1

Stackless Python è un'altra opzione che soddisfa i requisiti. Se Python, Ruby e Perl sono tutti inadatti ai tuoi scopi (nonostante tutti i requisiti dichiarati), presumibilmente hai altri requisiti o preferenze non dichiarati - ti interessa scriverli? -)

+0

Voglio valutare tutte le mie opzioni prima di scegliere una lingua. Non scelgo subito il ruby ​​perché il GC può essere piuttosto lento con grandi heap e non scelgo immediatamente Perl a causa della sua sintassi relativamente sgradevole. Detto questo, Perl è l'attuale capofila. –

+0

Inoltre, sai se PEP 342 rende adatto Python regolare? send() sembra un passo nella giusta direzione, ma non riesco a capire se è possibile cedere dal deep stack di chiamate. –

+1

@Logan, un generatore Python può cedere solo al suo chiamante, non a nessun altro punto arbitrario - per costruire comunque un sistema di coroutine, si usa un arrangiamento "trampolino", come esemplificato nell'Esempio 3 in PEP 342. –

1

Schema ha call-with-current-continuation che è un edificio blocco su cui possono essere costruiti tutti i tipi di controllo di flusso. Sicuramente può supportare i due usi che hai citato.

Esistono molte implementazioni di Scheme robuste e ampiamente disponibili come PLT Scheme e Chicken Scheme.

+0

Ruby ha ' callcc' sia. Non molto veloce, perché copia l'intero stack C. – pts

6

greenlet estensione soddisfa le vostre esigenze in Python (uno normale, non Stackless).

L'API di Greenlet è un po 'di basso livello, quindi mi raccomando di usare gevent che ti dà l'API adatta per un'applicazione. (Disclaimer: ho scritto gevent)

+0

+1, greenlet è di qualità, ma gevent non supporta python 3 –

Problemi correlati