में पाइथन सॉकेट.कनेक्ट टाइमआउट त्रुटि निम्न की तरह, मैं एक विशिष्ट आईपी रेंज में कई पीसी के साथ संवाद करना चाहता हूं।पाइथन सॉकेट। मल्टीथ्रेड या मल्टीप्रोसेस
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()