2010-05-26 10 views
6

¿Se puede utilizar ajax para lograr un verdadero multihebra? Si se puede, ¿cómo se hace? por favor dame algo de información relacionada, sitio web o libros. gracias ~!ajax multihebra

Respuesta

15

Depende de lo que quiere decir con "multiproceso".

El código de Javascript es claramente singlethreaded. Ningún código Javascript interrumpirá ningún otro código JavaScript que se esté ejecutando actualmente en la misma página. Una solicitud AJAX (XHR) activará el navegador para hacer algo y (típicamente) llamará una devolución de llamada cuando finalice.

En el servidor, cada solicitud de Ajax es una solicitud HTTP por separado. Cada uno de estos se ejecutará en su propio hilo. Dependiendo de la configuración del servidor web, es posible que ni siquiera se ejecuten en la misma máquina. Pero cada instancia de script PHP estará completamente separada, incluso si llama al mismo script. No hay un estado compartido per se.

Ahora, los navegadores suelen limitar el número de solicitudes simultáneas de Ajax que puede realizar una página por host. Este número es típicamente 2. Creo que puede cambiarlo, pero dado que la mayoría de las personas tendrá el valor predeterminado, debe suponer que será 2. Más solicitudes que eso harán cola hasta que se complete una solicitud existente. Esto puede llevar a tener que hacer cosas molestas como crear múltiples nombres de host como req1.example.com, req2.ejemplo.com, etc.

La única excepción son las sesiones, pero no son multiproceso. Iniciar una sesión bloqueará todos los demás scripts que intenten iniciar exactamente la misma sesión (basada en la cookie). Esta es una razón por la cual necesita minimizar la cantidad de tiempo que se abre una sesión. Podría decirse que podría usar una base de datos o algo así como Memcache para modificar la comunicación entre guiones, pero en realidad no se trata de PHP.

PHP se utiliza mejor para el procesamiento de solicitudes simples. Una solicitud es recibida. Se procesa y se devuelve una respuesta. Esa respuesta podría ser HTML, XML, texto, JSON o lo que sea. La solicitud podría ser una solicitud HTTP del navegador o una solicitud AJAX.

Cada uno de estos ciclos de solicitud-respuesta debe, cuando sea posible, tratarse como entidades separadas.

Otra técnica utilizada es el sondeo largo. Se envía una solicitud HTTP al servidor y es posible que no regrese durante un tiempo prolongado. Esto se utiliza para el chat basado en la web y otros escenarios de tipo "servidor de inserción". A veces, las respuestas parciales se eliminarán sin finalizar la solicitud.

La última opción (en Unix/Linux como mínimo) es que PHP puede generar procesos, pero eso no parece ser a lo que te refieres.

Entonces, ¿qué es exactamente lo que estás tratando de hacer?

+0

¿Quizás está bajo la suposición de que uno tiene que esperar a que se complete una solicitud de Ajax antes de que otro pueda ser despedido? Si es así, si una función dispara 5 solicitudes ajax una después de la otra, no esperará a que la solicitud vuelva antes de procesar la segunda.no disparará los 5 en el _exact_ mismo tiempo, como se mencionó, pero todos se ejecutarán en unos pocos milisegundos unos de otros normalmente –

+0

Esta es una buena respuesta, pero vale la pena señalar que la mayoría de los navegadores limitarán el número de solicitudes que puede enviar a las dos (aunque esto se puede cambiar en la configuración del navegador) y pondrá en cola el resto, por lo que es posible que no pueda obtener una aceleración significativa al realizar solicitudes paralelas. –

+0

@ Dan oh, estaba pensando en poner eso pero lo olvidé. Gracias por sacar el tema. – cletus

3

En realidad, no es posible utilizar varios subprocesos, pero lo que muchos sitios web más grandes hacen es descargar la salida de una página y luego usar Ajax para cargar componentes adicionales sobre la marcha para que el usuario vea el contenido incluso cuando el navegador todavía está solicitando nueva información. Es una buena técnica para saber pero, como todo lo demás, debes tener cuidado con tu uso.