Posteado por: kmilodenisgonzalez | febrero 9, 2011

escanear-ip_threading_multiprocessing

Este es un pequeño ejemplo empleando el módulo multiprocessing incluido a partir de la versión 2.6 de Python, este pequeño código escanea una subred para determinar aquellas PC que tienen carpetas compartidas, creando en mi caso dos procesos y distribuyendo equitativamente por cada uno las acciones a realizar.

from multiprocessing import Process, Queue

import threading
from socket import socket

class Async(threading.Thread):
    def __init__(self, ip, puerto=139):
        threading.Thread.__init__(self)
        self.con = socket()
        self.dir_ip = ip
        self.puerto = puerto
    def run(self):
        dir = (self.dir_ip,self.puerto)
        try:
            self.con.connect(dir)
            print "El IP %s tiene conexion. \n" % self.dir_ip
            return
        except:
            return

def proceso(cola):
    for ip in iter(cola.get, 'STOP'):
        background = Async(ip)
        background.start()
    #background.join()


if __name__ == '__main__':
    cola = Queue()

    for i in xrange(1,50):
        cola.put('10.31.15.%s'%i)

    for i in xrange(2):
        Process(target=proceso, args=(cola,)).start()

    for i in xrange(1,50):
        cola.put('STOP')
        print "Deteniendo el proceso #%s" % i

Otra via para lograr esto.

Haciendo uso de modulo multiprocessing.Pool de python podemos crear un conjunto de procesos llevando a cabo las tareas que se le presenten, esta podria ser la mejor forma.
El metodo map_async (admite solo un argumento iterable), sin embargo este se bloquea una vez que el resultado está listo. Su objetivo es iterar enviando los valores a la piscina de procesos como si fueran tareas independiente.
El metodo get() retorna el resultado una vez obtenido.

from multiprocessing import Pool

import threading
from socket import socket

class Async(threading.Thread):
    def __init__(self, ip, puerto=139):
        threading.Thread.__init__(self)
        self.con = socket()
        self.dir_ip = ip
        self.puerto = puerto
    def run(self):
        dir = (self.dir_ip,self.puerto)
        try:
            self.con.connect(dir)
            print "El IP %s tiene conexion. \n" % self.dir_ip
            return
        except:
            return


def proceso(ip):
    print ip
    background = Async(ip)
    background.start()

def ciclo():
    for i in xrange(1,50):
        yield '10.31.15.%s'%i

if __name__ == '__main__':

    pool = Pool(processes=4)
    pool.map_async(proceso, ciclo()).get()

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Categorías

A %d blogueros les gusta esto: