2010-11-17 18 views
7

में पाइथन सॉकेट.कनेक्ट टाइमआउट त्रुटि निम्न की तरह, मैं एक विशिष्ट आईपी रेंज में कई पीसी के साथ संवाद करना चाहता हूं।पाइथन सॉकेट। मल्टीथ्रेड या मल्टीप्रोसेस

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

क्योंकि संवाद करने के लिए बहुत सारे ग्राहक हैं, मैंने इसे मल्टी-थ्रेडिंग द्वारा आजमाया। सॉकेट.कनेक्ट() लगातार टाइम-आउट त्रुटि उत्पन्न करता है। यदि मैं इसे एकल-थ्रेड में आज़माता हूं, तो कोई समस्या नहीं है।

मैं googled और नीचे पाया:

Python Interpreter blocks Multithreaded DNS requests?

कह रही है कि कुछ मंच में, सॉकेट मॉड्यूल असुरक्षित थ्रेड जा सकता है।

इसलिए मैंने अपना कोड बहु-प्रसंस्करण में बदल दिया। हालांकि यह अभी भी एक ही त्रुटि उत्पन्न करता है।

निम्नलिखित कोड नमूने में, test_single() सामान्य खत्म होता है। test_mp() और test_mt() दोनों टाइम-आउट त्रुटि करते हैं।

क्या आपने कभी असामान्य व्यवहार अनुभव किया है? परीक्षण वातावरण विंडोज एक्सपी एसपी 3, पायथन 2.5.4 है। ने भी पाइथन 2.6.6 और 2.7.0, एक ही त्रुटि पर कोशिश की।

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

उत्तर

5

डेविड Beazley चारों ओर अजगर जीआईएल कुछ महान शोध किया है और कैसे है कि आईओ और बहु ​​सूत्रण प्रभावित करता है। आप अपने शोध here, here के बारे में जानकारी प्राप्त कर सकते हैं।

संबंधित मुद्दे