Hola,
es posible simular de alguna manera el syncronized de Java? Es decir, conseguir que se ejecute un método de un objeto de forma única.
Gracias.
| |||
Es posible simular el syncronized de Java con PHP? Hola, es posible simular de alguna manera el syncronized de Java? Es decir, conseguir que se ejecute un método de un objeto de forma única. Gracias. |
| |||
Hola dominguez para ejecutar un método de un objeto de forma única, lo que yo entiendo es un método estático por ejemplo en PHP5 <?php class Prueba { static function saludar() { print "Hola gente!"; } } Prueba::saludar(); ?> Como sabes las funciones o métodos estáticos serán iguales para todos los objetos. Si lo que quieres es tener una instancia de un solo objeto entonces puedes aplicar el patrón de diseó más fácil y más famoso el Singleton. Por ejemplo: <?php class Singleton { static private $instance = NULL; private function __construct() { } static public function getInstance() { if (self::$instance == NULL) { self::$instance = new Singleton(); } return self::$instance; } } $Objeto1 = Singleton::getInstance(); $Objeto2 = Singleton::getInstance(); ?> El primer objeto llamará a la instancia que creará el objeto singleton el segundo objeto llamará a la misma instancia y al comprobar q el objeto está creado retornará la referencia al mismo objeto singleton. Más claro esta es una forma de obtener una sola creacion de un objeto por ejemplo es útil para asegurarnos que solo tenemos una conexion de base de datos abierta. |
| |||
Hola, no, eso no es exactamente lo que quiero. Lo que quería saber es si era posible realizar la ejecución única de un método, es decir, que sólo se está ejecutando una sola vez, aunque haya 1000 objetos llamando al método. Un ejemplo es el "syncronized" de Java, que nos asegura que sólo hay un objeto ejecutando el código que encierra. Un saludo. |
| |||
Bueno si quieres utilizar threading (aunque no se bien para que...) tendrías de dar algo más de información, puedes utilizar las funciones de (Semaphore, Shared Memory and IPC Functions ) que para mi entender son igual de duras que las de Unix aquellas famosas practicas tediosas de memoria semaforos y fork nunca más jajaja En el manual de php encontraras las referencias para System V php threads es la página en inglés aunque creo que encontrarás la versión en castellano también. |
| ||||
Cita: eso se puede apreciar en tu post inicial, mi pregunta va orientada a con que objetivo deseas utilizar un synchronized{}, eso es útil unicamente cuando manejas threads, cosa que php no hace. Un thread es útil, entre otras cosas, cuando deseas ejecutar tareas en paralelo.
Iniciado por dominguez Quiero ejecutar cierto código dentro de un "sincronized", tal y como se hace en Java y quería saber si eso era posible. Gracias por el interés. Por ejemplo, multiples clientes conectandose a una interfaz de linea de comandos (CLI) por sockets de UNIX. |
| |||
Tengo un método: public static function getUid() { ... } que lo que hace es obtener un UUID (Identificador único) y pensé que este método debería ser "syncronized" para no dar la posibilidad de que se genere el mismo UUID. Pero si el "syncronized" sólo tiene sentido con threads, entonces no lo puedo utilizar no? Gracias por el interés. |
| ||||
correcto. en tu caso puedes por ejemplo, usar un archivo o base de datos para almacenar el siguiente UID, y "lock"ear el archivo para que no se pueda acceder hasta que un mismo proceso termine de leerlo y escribirlo. Sería perfectamente equivalente para synchronized. Incluso puedes crear un archivo con código php que luego evaluas con eval() para simular de una manera un tanto primitiva y menos eficiente un synchronized. saludos |
| |||
Una variante, si solo .... Hola : Si solamente necesitaras obtener un UID por ejecucion pudieras utilizar los ID generados por PHP para identificar las sessiones; el mismo PHP te garantiza que no se repetira. A lo mejor es tu caso. Ahora, si necesitaras generar diferentes UID por cada ejecucion, varios en una misma ejecucion entonces necesitaras acudir codigo de exclusion mutua, semaforos, etc...; ya sea utilizando una base de datos ( que implementa uno claro esta ), utilizando locks o implementando tu mismo un semaforo. Saludos
__________________ Alojamiento Web - Alojamiento web y Servidores dedicados. Servidores en USA y Londres. Hosting,PHP,Java,CSS,SEO BLOG - Web Hosting, Posicionamiento Web, Programacion en PHP, Java, CSS y mucho mas. |
| |||
El uso de Threading, esta dentro del ámbito de los ambientes multiprogramados, es decir en ambientes donde varios elementos intentan acceder al mismo recurso, y en donde un planificador administra la posesión de esos recursos, como es el caso de los sistemas operativos donde un programa crea un proceso y el uso de recursos es otorgado por el planificador que permite coordinar el acceso a disco duro, memoria, y demás dispositivos además del tiempo de procesamiento, ahora los threading no son del todo lo mismo que los procesos, pero ese es otro tema. Si tu aplicación es vía HTTP, no es necesario que que los uses el HTTP descarga archivos y cada petición a un que parezca inmediata no es simultanea es decir que cada petición esta encolada para ser despachada así que las posibilidades de que varios clientes invoquen el método al mismo tiempo son mínimas, ahora si a un así quieres hacerlo con la idea que propone sism82 debe de funcionar yo aplicaría la de base de datos. ya que las consultas también son encoladas, no son simultaneas así que puedes hacer un secuenciador para crear tu ID y bueno cada consulta obtendrá un ID único
__________________ Saludos! Mty-NL.. |