2010-11-17 23 views
7

Podobnie jak poniżej, chciałbym komunikować się z wieloma komputerami w określonym zakresie IP.Python socket.connect błąd limitu czasu w mulithread lub multiprocess

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

Ponieważ jest zbyt wielu klientów do komunikacji, próbowałem go przez mulit-threading. socket.connect() stale generuje błąd przekroczenia limitu czasu. Jeśli spróbuję go w jednym wątku, nie ma problemu.

google i znaleźć poniżej:

Python Interpreter blocks Multithreaded DNS requests?

mówiąc, że w jakiejś platformie, moduł gniazdo może być niebezpieczne wątku.

Zmieniłem mój kod w multi-processing. Jednak nadal powoduje ten sam błąd.

W poniższym kodzie przykładowym test_single() kończy się normalnie. Test_mp() i test_mt() powodują błąd limitu czasu.

Czy kiedykolwiek doświadczyłeś nienormalnego zachowania? Środowisko testowe to Windows XP SP3, python 2.5.4. Próbowano również na python 2.6.6 i 2.7.0, ten sam błąd.

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() 

Odpowiedz

5

David Beazley zrobiła jakąś wielką badania wokół Python GIL i jak to wpływa na IO i wielowątkowość. Możesz znaleźć informacje o jego badaniach here, here.

Powiązane problemy