Python - hilos que tardan mucho

   
Vista:

hilos que tardan mucho

Publicado por Luiss (1 intervención) el 10/03/2008 10:28:48
Hola a todos,

Tengo una aplicación en la que envío el mismo mensaje a un conjunto de PC's.

Uso un hilo por cada socket a enviar:

> import thread
> ....
> ...
> ...
>
> for ip in ips: #ips es una lista con las ips destino
> thread.start_new(envia_socket,(ip,puerto,mensaje))
>

La función envia_socket sólo se dedica a enviar el mensaje al destino:

> def envia_socket(servidor,puerto,msg):
>
> s=socket(AF_INET,SOCK_STREAM) #creamos socket tipo TCP/IP
> #s.settimeout(20)
> try:
> s.connect((servidor,puerto)) #nos conectamos al servidor
> s.send(msg)
> s.close() # cerramos conexion
> envio_ok.append(servidor)
> except timeout:
> error1.append(servidor)
> except error: # si error capturamos excep
> error2.append(servidor)
>

El problema es que si envío un mensaje a un sólo equipo y el pc está apagado el socket intenta conectar durante unos 20 seg. En cambio si se lo mando a unos 30 equipos y estos está apagados la ejecución se demora hasta pasar el minuto. Si uso threading me ocurre lo mismo. Y si establezco un settimeout he de poner un tiempo elevado para que recorra todos los equipos.

No sé si estos tiempos son normales, pero si son procesos en pararelos ... ¿no debería tardarme aproximadamente lo mismo en enviar a un equipo que a varios? Creo que algo hago mal, a ver si pueden ayudarme. Gracias !
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:hilos que tardan mucho

Publicado por Antonio Fernández Porrúa (3 intervenciones) el 03/01/2011 12:46:03
Podrías probar con sockets no blocantes, o con procesos en vez de con hilos

con procesos puedes hacer así:

> from pykiss import fork
> ....
> ...
> ...
>
> def nada(retorno): pass
# se necesita una función callback que se ejecutará con el valor devuelto
# como no devuelves nada ni haces nada ni quieres hacer nada si ha terminado
# esta funcion vale
> control = fork.Control() # este objeto se encarga de crear y limpiar los procesos
> for ip in ips: #ips es una lista con las ips destino
> control.fork_function(nada, envia_socket, ip,puerto,mensaje)
>

#aunque no devuelvas nada ni ejecutes callbacks es necesaria este método para limpiar los procesos finalizados
#se quedará aquí hasta que terminen todos, puedes llamarla más alante si quieres, o usar su versión asincrona control.do(0)
control.main()
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar