python socket.connect error de tiempo de espera en mulithread o multiproceso

Al igual que a continuación, me gustaría comunicarme con muchas PC en un rango de IP específico.

My PC ---+------> Client A PC
         +------> Client B PC
         +------> Client C PC
         .................
         +------> Client Z PC

Debido a que hay demasiados clientes para comunicarse, lo probé mediante subprocesos múltiples. socket.connect () produce continuamente un error de tiempo de espera. Si lo intento en un solo hilo, no hay problema.

Busqué en Google y encontré lo siguiente:

Python Interpreter bloquea las solicitudes de DNS multiproceso

diciendo que en alguna plataforma, el módulo de socket podría ser inseguro.

Entonces cambié mi código a multiprocesamiento. Sin embargo, todavía produce el mismo error.

En el siguiente ejemplo de código, test_single () finaliza normal. test_mp () y test_mt () cometen un error de tiempo de espera.

¿Alguna vez has experimentado un comportamiento tan anormal? El entorno de prueba es Windows XP SP3, python 2.5.4. También probé en python 2.6.6 y 2.7.0, mismo error.

import multiprocessing
import Queue
import socket
import threading

PROCESS_NUM = 5
PORT = 8888

def search_proc(ip):
    try:
        csock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        csock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        csock.settimeout(5.0)
        csock.connect((ip, PORT))
        csock.shutdown(socket.SHUT_RDWR)
        csock.close()
        return ip, "ok"
    except socket.error, msg:
        return ip, "fail", msg

def mp_connect(ip_range):
    pool = multiprocessing.Pool( PROCESS_NUM )
    for output in pool.imap_unordered(search_proc, ip_range):
        print output

def test_mp():
    ip_range = []
    for i in range(256):
        ip_range.append("192.168.123.%d"%(i,))

    mp_connect(ip_range)

def test_mt():
    def search_thread(ip_queue):
        while True:
            ip = ip_queue.get()
            print search_proc(ip)
            ip_queue.task_done()
    ip_queue = Queue.Queue()

    for i in range(256):
        ip_queue.put("192.168.123.%d"%(i,))

    for i in range(PROCESS_NUM):
        th = threading.Thread(target=search_thread, args=(ip_queue,))
        th.setDaemon(True)
        th.start()

    ip_queue.join()

def test_single():
    ip_range = []
    for i in range(256):
        print search_proc("192.168.123.%d"%(i,))

if __name__ == "__main__":
    multiprocessing.freeze_support()
    test_mp()
    #test_single()
    #test_mt()

Respuestas a la pregunta(1)

Su respuesta a la pregunta