Introducción

pthreads es una API orientada a objetos que permite la ejecución multihilo en el espacio de usuario de PHP. Incluye todas las herramientas necesarias para crear aplicaciones multihilo. Las aplicaciones de PHP pueden crear, leer, escribir, ejecutar y sincronizar objetos Thread, Worker y Threaded.

Un objeto Threaded: Un objeto Threaded forma la base de la funcionalidad que permite a pthreads operar. Expone métodos de sincronización y algunas interfaces útiles para el programador.

Un Thread: El usuario puede implementar un Thread (Hilo) extendiendo la declaración de Thread que proporciona pthreads, implementando el método run. Cualquier miembro puede ser escrito y leído por cualquier contexto con una referencia al objeto Thread; también, cualquier contexto puede ejecutar cualquier método público o protegido. El método run de la implementación se ejecuta en un hilo diferente cuando se invoca al método start de la implementación desde el contexto (esto es, hilo o proceso) que lo creó. Solamente el contexto que crea el hilo puede iniciarlo y unirlo.

Un objeto Worker: Un Worker Thread posee un estado persistente, y estará disponible desde la llamada a start hasta que el objeto salga del ámbito, o se apague explícitamente. Cualquier contexto con una referencia puede apilar objetos sobre el Worker, los cuales serán ejecutados por el Worker en un Thread diferente. El método run de un Worker se ejecuta antes de cualquier objeto de la pila, de tal forma que se pueden inicializar recursos que podrían necesitar los objetos venideros.

Una Pool: Una Pool de hilos Worker se puede emplear para distribuir objetos Threaded entre objetos Worker. La clase Pool incluida implementa esta funcionalidad cuidando de realizar la referenciación de una manera apropiada. Introducida en v1.0.0, la implementación de Pool es la forma más fácil y eficiente de utilizar múltiples hilos.

Precaución

Pool es un objeto normal de PHP, por lo que sus instancias no deberían compartirse entre contextos.

Sincronización: Todos los objeto que crea pthreads poseen sincronización interna en la forma ( familiar para los programadores de Java ) de ::wait y ::notify. La invocación de ::wait sobre un objeto causará que el contexto espere a que otro contexto invoque a ::notify sobre el mismo objeto. Esto pertmite una sincronización potente entre objetos Threaded de PHP.

Precaución

Cualquier objeto cuyo propósito sea emplearlo en escenarios multihilo de una aplicación debería extender a Threaded.

Modificadores de métodos: Los métodos protegidos de objetos Threaded están protegidos por pthreads, por lo que solamente un contexto podría llamar a dichos métodos a la vez. Los métodos privados de objetos Threaded solamente pueden ser invocados desde dentro de un objeto Threaded durante su ejecución.

Almacenamiento de datos: Como regla general, cualquier tipo de dato que se pueda serializar puede ser empleado como un miembro de un objeto Threaded; puede ser leído y escrito desde cualquier contexto con una referencia al objeto Threaded. No todos los tipos de datos se almacenan en serie; los tipos básicos se almacenan en su forma verdadera. Los tipos complejos, los arrays, y los objetos que no son Threaded se almacenan en serie; pueden ser leídos y escritos en el objeto Threaded desde cualquier contexto con una referencia. Con la excepción de los objetos Threaded, cualquier referencia empleada para establecer un miembro de un objeto Threaded está separada de la referencia del objeto Threaded; los mismos datos pueden ser leídos directamente desde el objeto Threaded en cualquier momento por cualquier contexto con una referencia al objeto Threaded.

Miembros estáticos: Cuando se crea un nuevo contexto ( Thread o Worker ), generalmente se copia, aunque los recursos y los objetos con un estado interno se anulan (por motivos de seguridad). Esto permite que funcionen como un tipo de almacen local de hilos. Por ejemplo, al iniciar el contexto, una clase cuyos miembros estáticos incluyen información de conexión a un servidor de bases de datos y la conexión misma, tendrá simplemente la información de la conexión copiada, no la conexión, permitiendo que el nuevo contexto inicie una conexión de la misma forma que el contexto que la creó, almacenando la conexión en el mismo lugar sin afectar al contexto original.

Precaución

Cuando se ejecutan print_r, var_dump y otras funciones de depuración de objetos, estas no incluyen protección de recursividad.

Nota:

Recursos: Las extensiones y la funcionalidad que definen recursos de PHP no están preparados para este tipo de entorno; pthreads toma medidas preventivas para que los recursos sean compartidos entre contextos; sin embargo, para la mayoría de tipos de recursos debería considerarse inseguro. Se deberían extremar las precauciones al compartir recursos entre contextos.

Precaución

En el entorno en el que se ejecute pthreads, son necesarias algunas restricciones y limitaciones para proporcionar un entorno estable.