2009-12-24 9 views
8

Me gustaría iniciar un nuevo proyecto de servidor de red en un lenguaje que admita la concurrencia a través de fibras aka coroutines también conocidas como subprocesos de modo de usuario. Determinar cuáles son exactamente mis opciones ha sido extremadamente difícil ya que el término "coroutine" parece usarse de manera bastante vaga para significar una variedad de cosas, y "fiber" se usa casi exclusivamente en referencia a la API de Win32.Lenguajes de script que admiten fibras/coroutines?

Para los fines de esta pregunta, corrutinas/fibras:

  • métodos de apoyo que detener la ejecución por produciendo un resultado de la función de llamada desde dentro de una función anidada (es decir arbitrariamente de profundidad en la pila de llamadas desde donde el corrutina/fibra se invoca)
  • apoyo transferir el control a otro corrutina arbitraria en su punto de ejecución actual (es decir, el rendimiento a un co-rutina que no llame a su corrutina)

¿Cuáles son mi opción de idioma s? Sé que Ruby 1.9 y Perl (Coro) ambos tienen apoyo, ¿qué más? Cualquier cosa con una invocación madura de un método gc y dinámico es suficiente.

Respuesta

1

Stackless Python es otra opción que cumple con sus requisitos. Si Python, Ruby y Perl son inadecuados para sus fines (a pesar de todo a sus exigencias corrientes), que presumiblemente tienen otras necesidades o preferencias no declarados - cuidado para ponerlos de manifiesto -?)

+0

Quiero evaluar todas mis opciones antes de elegir un idioma. No elijo inmediatamente ruby ​​porque el GC puede ser bastante lento con montones grandes y no elijo inmediatamente Perl por su sintaxis relativamente fea. Dicho esto, Perl es el favorito actual. –

+0

Además, ¿sabes si PEP 342 hace que Python regular sea adecuado? send() parece un paso en la dirección correcta, pero no puedo decir si es posible ceder desde lo más profundo de la pila de llamadas. –

+1

@Logan, un generador Python solo puede ceder a quien llama, no a otro lugar arbitrario: para construir un sistema coroutine de todos modos, uno usa una disposición de "trampolín", como se ejemplifica en el Ejemplo 3 en PEP 342. –

1

Esquema tiene call-with-current-continuation que es un edificio bloque en el que se pueden construir todos los tipos de control de flujo. Definitivamente puede soportar los dos usos que mencionaste.

Hay muchas implementaciones robustas, ampliamente disponibles del Esquema como PLT Scheme y Chicken Scheme.

+0

Ruby tiene ' callcc' tampoco. No es muy rápido, porque copia toda la pila C. – pts

6

greenlet extensión cumple con sus requisitos en Python (regular, no apilada).

Greenlet API es un poco de bajo nivel, por lo que recomiendo usar gevent que le da API adecuada para una aplicación. (Descargo de responsabilidad: escribí gevent)

+0

+1, greenlet es calidad, pero gevent no es compatible con python 3 –

Cuestiones relacionadas