Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Comunicación entre procesos

Iniciado por Desiresportal, 24 de Febrero de 2014, 03:29:30 PM

« anterior - próximo »

Desiresportal

Para empezar diré que esta pregunta la plantee en: http://www.foro3d.com/f115/comunicacion-entre-procesos-114319.html#post898541

La formulo aqui por que es lo que me recomendarón. Empezemos. (es copia y pega)

Hola:

Me preguntaba si existe alguna forma de hacer lo siguiente y de ser así... ¿Como?:

- Pasar variables de PHP a Python
- Pasar variables de Python a PHP (sin el método GET) (¿Se pueden pasar variables del tipo $_SESSION["Ejemplo"]?)

Me explico:

Supongamos que tengo una web. En esta web hay un juego. Dicho juego necesita saber, cada vez que el usuario recarga la pagina, cuales son las mejores puntuaciones. Pero no quiero que esté todo el rato leyendo un txt, un csv o una base de datos mysql. Quiero enviar los datos desde un PHP a una consola de Python que esté siempre abierta en el servidor, que esta consola procese los datos y envie al mismo PHP o a otro, los resultados.

De esta forma espero mover los datos en la memoria RAM y no en el disco duro. Así no resto vida útil a mi pobre disco duro que esta muy cerca de su final.

¿Cuales serían los scripts o comandos necesarios para esto?
(Como extra: ¿Podría pasar Listas o Arrays directamente?)

Con todo esto busco evitar el uso de sockets. (La razón es que siempre me lanza el error 10049 que aparece ponga la IP que ponga. Usé una programación con autobusqueda para que asigne otra IP en caso de error y no hace mas que cambiar de IP todo el rato. La única solución que veo para los socket en Python es reinstalar el sistema operativo. No apetece y no puedo hacerlo por que no puedo guardar toda la información útil en otra unidad. Aparte de que tampoco tengo Internet en casa de modo que no puedo colgarlo todo en la nube.)

Si me estoy equivocando con respecto a lo de mover los datos en la RAM, por favor, decidmelo.

Por otro lado, para aquel que me diga "No sirve de nada que te dé el script echo, si no vas a entender lo que hace a cada instrucción": Yo soy un poco curioso y cada vez que encuentro un script intento entenderlo. De no entender lo que hace, lo busco. De buscarlo y no encontrar una respuesta que me lo aclare, lo dejo de lado. Pero pasado el tiempo, vuelvo a abrir el script y vuelvo a tratar de entenderlo. No soy de los que dicen "Funciona ¿no? ¡Pues ya esta!". Soy consciente de que debo saber como funciona para saber aplicarlo a otros fines y con otros parámetros (en caso de necesitarlo).

Un saludo y gracias por adelantado.

Desiresportal

He leído algo sobre bloques de memoria compartida. Por lo que tengo entendido es como hacer una "caja" donde meter variables y que los programas que lo necesiten cojan los datos de esa "caja".

¿Es posible que sea lo que busco? ¿Como lo hago con Python y PHP en windows?

¿Que problemas pueden surgir? ¿Puede causar una gran avería al equipo si se hace algo mal? ¿Es complicado? ¿O es como sumar y restar variables una vez que se entiende el proceso?

Hechelion

Saludos.

Primero, tanto PHP como Python son lenguajes de nivel alto y el acceso a memoria compartida requiere de un lenguaje de más bajo nivel como C/C++.
En Python, lo único que conozco que podría servirte es la "Global Shared Memory" pero me parece que solo sirve entre 2 procesos de Python y que no hay forma de compartir memoria con otras aplicaciones.
De PHP no sé más allá de lo básico, pero de lo poco que yo sé, es un lenguaje aún más limitado en cuanto al acceso a hardware a bajo nivel, por lo cual dudo que sea posible hacer lo que quieres, sin embargo toma con pinzas esto que te digo, ya que no soy experto en PHP.

Respecto a averiar tu hardware, lo dudo mucho, lo más que podrías hacer es acceder a la memoria restringida de otro programa o a dejar tomada parte de la memoria, nada que un reset del PC no solucione. En todo caso, no es algo trivial, por lo cual no vas a encontrar mucha información y menos aún en plan tutorial para novatos, pero una vez que lo entiendes (debes tener una base previa de como se direcciona la memoria de una aplicación) no es complicado (con lenguajes que lo permitan, como C/C++).
En todo caso, ten en cuenta que compartir memoria entre 2 aplicaciones, solo te sirve si ambas aplicaciones corren en el mismo equipo, para un modelo cliente/servidor esto es imposible.


Ahora, si me permites, quisiera hablar un poco de tu primer post, en inicio no lo contesté por que sinceramente no te podía dar ninguna respuesta a lo que preguntas y me carga que la gente conteste B si preguntaste A y al final de cuentas, es tu aplicación y tu sabes lo que quieres hacer, pero si me permites la licencia, creo que estás mal enfocado.

Si tienes un disco duro que está tan al borde la muerte que no te atreves a usarlo para escribir y leer un simple TXT o un CVS entre 2 aplicaciones, es para mi un disco duro que debería estar en la basura. Ten en cuenta que tu OS está haciendo uso de ese disco todo el día y cualquier desarrollo que hagas probablemente lo pierdas por que mañana el disco estará muerto. No me quiero meter en tu bolsillo o en tu diseño, pero lo que planteas no me cuadra por ningún lado, es como matar moscas a cañonazos. Leer y escribir un archivo por 2 aplicaciones y solo cuando refrescas el juego es un uso mínimo.

Otra cosa que no me queda clara es por que necesitas reinstalar el OS para poder usar los socket y por que estás "buscando" una IP.

Desiresportal

Gracias por la respuesta.

Estaba pensando en orientarlo hacia juegos en tiempo real. Pero para ese caso tal vez sea mejor instalar windows en otro ordenador y utilizar dicho ordenador única y exclusivamente como servidor de sockets en Python.

En cuanto a la vida útil del disco duro, según Hard Disck Sentinel, le quedan mas de 1000 dias de vida. No esta, como dices tu, "para tirarlo a la basura". Solo quiero prologar su vida útil todo lo posible (como todo el mundo supongo).

Estaba pensando, que al tratarse de juegos en tiempo real, sería demasiada carga para el disco duro. Mas aún si son mas de 1000 jugadores en lugar de solamente 2.

En cuanto a nivel alto o bajo, veo que estaba equivocado. Creía que era a la inversa. Que el lenguaje que podía acceder al hardware era el de nivel alto. Pero ahora entiendo que se trata de algo parecido a las capas OSI de las redes.

De todas formas no me esperaba estropear físicamente el ordenador si cometía algún fallo en la memoria compartida, creo que eso no es posible. Me preocupaba estropear Windows y tener que reinstalar todo perdiendo todos o gran parte de mis archivos.

Un saludo y muchas gracias por aclararme dudas que ni siquiera me había planteado.

Gallo

Lo que puedes hacer es guardar los resultados en la ram y mirarlos siempre en la ram, y de tanto en tanto volcar al disco duro esa información, hoy en dia se hace mucho esto de las bases de datos en memoria ram.

https://www.sqlite.org/inmemorydb.html






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.