Foros del Web » Programando para Internet » Python »

multi procesos en python

Estas en el tema de multi procesos en python en el foro de Python en Foros del Web. Buenas a todos: Necesito desarrollar una aplicacion que, digamos, simule el comportamiento de varios dispositivos hardware (emulados, obviados y simplificados por el software) que se ...
  #1 (permalink)  
Antiguo 24/03/2009, 03:32
 
Fecha de Ingreso: marzo-2009
Mensajes: 7
Antigüedad: 15 años, 1 mes
Puntos: 0
Pregunta multi procesos en python

Buenas a todos:

Necesito desarrollar una aplicacion que, digamos, simule el comportamiento de varios dispositivos hardware (emulados, obviados y simplificados por el software) que se ejecuten en la misma maquina (pero suponiendo siempre que es una simulacion de varios dispositivos independientes, cada uno en su maquina).
El caso es que estos dispositivos deben comunicarse entre sí mediante sockets, y la verdad es que estoy intentando darle el enfoque arquitectónico para ver cómo habria de ser, así por encima la aplicacion.

Yo habia pensado hacer una clase Dispositivo y luego, cada vez que se llame a un constructor de dispositivo, hacerlo en un thread distinto, para que digamos emule un comportamiento independiente de los dispositivos, pero es que ahora que caigo los threads no son independientes...yo lo intenté sin hilos, pero claro, al ejecutar el metodo socket.accept() pues hay una espera bloqueante, con lo cual no me vale (aunque me valdría si esta espera bloqueante se produjese en un dispositivo y al bloquearse saltase automaticamente al siguiente)

¿Se le ocurre a alguien una idea más o menos así por encima de cómo habria de ser la aplicacion?

Espero vuestras respuestas.
Un saludo y muchisimas gracias por adelantado
  #2 (permalink)  
Antiguo 24/03/2009, 11:41
 
Fecha de Ingreso: marzo-2009
Mensajes: 7
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: multi procesos en python

Pongo un ejemplo:

Código python:
Ver original
  1. import socket
  2. import threading
  3. class MiThread(threading.Thread):
  4.     def run(self):
  5.         printf("Ejecutando")
  6.     def transmitir(self):
  7.             #datos en crudo, no hacemos procesamiento de datos ni nada: todo se envia a todos
  8.             if not (s == None):
  9.                 i = 0
  10.                 while i <= numclientes:
  11.                     sc.send(self.aceleracion.encode())
  12.                     sc.send(self.aceleracion.encode())
  13.                     sc.send(self.aceleracion.encode())
  14.                    
  15.     def __init__(self,direccion,velocidad,aceleracion):
  16.         threading.Thread.__init__(self)
  17.        
  18.         self.direccion = direccion
  19.         self.velocidad = velocidad
  20.         self.aceleracion = aceleracion
  21.         print ("El vehiculo tiene una velocidad de",velocidad, "y una aceleracion de", aceleracion,"siguiendo la direccion", direccion)
  22.         s = socket.socket()
  23.         puerto = 50005
  24.         puertoNuevo = puerto + 1
  25.         s.bind(('localhost',puertoNuevo))
  26.         s.listen(3) #lo dejamos en 3 de momento, puesto que usaremos 3 objetos
  27.         #El metodo accept bloquea la ejecucion a la espera de conexiones
  28.         #accept devuelve un objeto socket y una tupla Ip y puerto
  29.         #Se necesita hacer forks para los distintos vehiculos, porque el metodo
  30.         print("Conexion inicializada")
  31.         #socket.accept() es BLOQUEANTE)
  32.         sc, addr = s.accept()
  33.        
  34.        
  35.  
  36. vehiculo1 = MiThread("norte",20,0)
  37. vehiculo1.start()
  38. vehiculo2 = MiThread("norte",30,0)
  39. vehiculo2.start()
  40. vehiculo3 = MiThread("sur",60,0)
  41. vehiculo3.start()

En este ejemplo que quiero que ese vehiculo pueda escuchar (con el metodo accept() ) pero a la vez pueda yo ejecutar el metodo transmitir (supongo que será con otro hilo, pero la verdad no se muy bien como se hace), y así para los 3 vehiculos
Además, ni siquiera llega a ejecutarse el metodo run(self) donde deberia imprimir por pantalla el "Ejecutando" ese...
  #3 (permalink)  
Antiguo 17/04/2009, 06:57
 
Fecha de Ingreso: abril-2009
Mensajes: 1
Antigüedad: 15 años
Puntos: 0
Respuesta: multi procesos en python

busca info sobre el modulo asyncore

saludos
  #4 (permalink)  
Antiguo 03/01/2011, 05:14
 
Fecha de Ingreso: enero-2011
Mensajes: 1
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: multi procesos en python

No tengo muy claro que quieres hacer con el ejemplo ese.

Puedes trabajar con sockets en modo no blocante.
Para ello tienes por ejemplo select.poll, pero es de muy bajo nivel.

yo tengo una librería que es pykiss.poll que es lo mismo pero de mayor nivel, te permite asignar callbacks a los eventos de I/O.

Si en vez de threads te animas a probar los procesos, tengo una librería llamada pykiss.fork que permite la comunicación entre procesos mediante eventos/callbacks, de una manera muy sencilla.

Esto sería equivalente a tu ejemplo
Código:
from pykiss import fork


class Vehiculo_Process(fork.Process):
    def main(self):
        printf("Ejecutando")
		self.instance_events['parametros'] = self.parametros
        fork.Process.main(self)

    def transmitir(self):
    		self.send_event(keyword = 'aceleracion', aceleracion = self.aceleracion)

	def parametros(self, evento):
    	self.direccion = evento['direccion']
    	self.velocidad = evento['velocidad']
    	self.aceleracion = evento['aceleracion']
        print ("El vehiculo tiene una velocidad de %s, y una aceleracion de %s, siguiendo la direccion %s"%(self.velocidad, self.aceleracion, self.direccion))


class Vehiculo_Driver(fork.Driver):
	def parametros(self, direccion, velocidad, aceleracion):
		self.send_event(keyword = 'parametros', direccion=direccion, velocidad=velocidad, aceleracion=aceleracion)

def reenviar(event, driver):
	for d in control.drivers:
		if d==driver:
			continue
		d.send_event(**event)

control = fork.Control()
control.events['aceleracion'] = reenviar


 
vehiculo1 = control.fork(Vehiculo_Driver, Vehiculo_Process)
vehiculo1.parametros("norte",20,0)

vehiculo2 = control.fork(Vehiculo_Driver, Vehiculo_Process)
vehiculo2.parametros("norte",30,0)

vehiculo3 = control.fork(Vehiculo_Driver, Vehiculo_Process)
vehiculo3.parametros("sur",60,0)
Pero no veo que haya nadie escuchando por la aceleración que envías, ni nada.
Si pones un ejemplo funcional te lo "convierto" a procesos concurrentes con pykiss

Última edición por pykiss; 03/01/2011 a las 05:32
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 07:06.