Error de tiempo de espera de socket.connect de Python en mulithread o multiproceso

Al igual que lo siguiente, 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é por medio de mulit-threading. socket.connect () produce continuamente un error de tiempo de espera. Si lo bash en un solo hilo, no hay problema.

Busqué en Google y encontré lo siguiente:

Python Interpreter bloquea solicitudes de DNS multiproceso?

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

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

En el siguiente ejemplo de código, test_single () termina normalmente. 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, el 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() 

David Beazley ha realizado una gran investigación sobre Python GIL y sobre cómo eso afecta a IO y al subprocesamiento múltiple. Puedes encontrar información sobre su investigación aquí , aquí .