2010-11-10 14 views
9

Ahora estoy escribiendo algún código con evented (En python usando gevent) y uso el nginx como servidor web y creo que ambos son geniales. Me dijeron que hay una compensación con los eventos, pero no pude verlo. Por favor alguien puede arrojar algo de luz?¿Por qué no debería usar async (evented) IO

James

+0

¿Por qué * no debería * usted? (No ha proporcionado ningún argumento a favor o en contra.) –

+0

Quiero saber cuál es la compensación ... – James

+0

coherencia del caché? complejidad del código? manejo de hilo? –

Respuesta

1

mayor problema es que sin hilos, un bloque para un cliente hará que un bloque para todos los clientes. Por ejemplo, si un cliente solicita un recurso (archivo en disco, memoria paginada, etc.) que requiere que el sistema operativo bloquee el proceso de solicitud, todos los clientes tendrán que esperar. Un servidor multiproceso puede bloquear solo un cliente y continuar sirviendo a otros.

Dicho esto, si el escenario anterior es improbable (es decir, todos los clientes solicitarán los mismos recursos), entonces el camino por recorrer es el camino a seguir.

+7

Lo que no mencionaste es que solo puedes acceder al recurso que necesitas de forma no bloqueante. De esta forma, no bloquea, puede seguir respondiendo a los clientes y obtendrá una devolución de llamada de su sistema de eventos cuando el recurso esté listo, todo en un solo hilo. – nosklo

+1

en segundo lugar, la idea del código basado en eventos es utilizar interfaces asíncronas para todo: sin E/S síncrona. aunque con Python incluso con gevent, twisted, etc. es bastante fácil accidentalmente usar alguna llamada de bloqueo si no tienes cuidado. Por cierto, esta es la página que todo el mundo cita cuando se habla de temas vs. eventos: http://www.kegel.com/c10k.html – cce

+2

@cce: si c10k no es suficiente, podemos probar c500k: http: //blog.urbanairship .com/blog/2010/09/29/linux-kernel-tuning-for-c500k / – jfs

9

La única dificultad de la programación con evented es que no debe bloquear, nunca. Esto puede ser difícil de lograr si utiliza algunas bibliotecas que fueron diseñadas con hilos en mente. Si no controla estas bibliotecas, un tenedor() + mensaje ipc es el camino a seguir.

Cuestiones relacionadas