मैंने अभी पाइथन और धागे के साथ थोड़ा सा खेला, और एक बहुप्रचारित लिपि में भी एहसास हुआ, DNS अनुरोध अवरुद्ध हो रहे हैं। आयात थ्रेड आयात सॉकेटपाइथन इंटरप्रेटर बहुभाषी DNS अनुरोध ब्लॉक करता है?
class Connection(Thread):
def __init__(self, name, url):
Thread.__init__(self)
self._url = url
self._name = name
def run(self):
print "Connecting...", self._name
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setblocking(0)
s.connect((self._url, 80))
except socket.gaierror:
pass #not interested in it
print "finished", self._name
if __name__ == '__main__':
conns = []
# all invalid addresses to see how they fail/check times
conns.append(Connection("conn1", "www.2eg11erdhrtj.com"))
conns.append(Connection("conn2", "www.e2ger2dh2rtj.com"))
conns.append(Connection("conn3", "www.eg2de3rh1rtj.com"))
conns.append(Connection("conn4", "www.ege2rh4rd1tj.com"))
conns.append(Connection("conn5", "www.ege52drhrtj1.com"))
for conn in conns:
conn.start()
मैं जानता हूँ कि वास्तव में कितनी देर टाइमआउट है न सूत्रण से
, लेकिन जब यह चल रहा है निम्न होता है:: निम्न स्क्रिप्ट पर विचार करें
- सभी धागे शुरू और मुझे अपने प्रिंटआउट
- प्रत्येक एक्सएक्स सेकेंड, एक थ्रेड डिस्प्ले एक बार
- टी पर सभी के बजाय समाप्त हो गया वह थ्रेड्स अनुक्रमिक रूप से खत्म होता है, सभी एक बार नहीं (टाइमआउट = सभी के लिए समान!)
तो मेरा एकमात्र अनुमान यह है कि इसे जीआईएल के साथ करना है? स्पष्ट रूप से धागे एक साथ अपने कार्य नहीं करते हैं, एक समय में केवल एक कनेक्शन का प्रयास किया जाता है।
क्या कोई इस के आसपास एक रास्ता जानता है?
(asyncore does not मदद, और मैं अब के लिए मुड़ उपयोग करने के लिए नहीं करना चाहते हैं) नहीं यह इस सरल छोटी बात अजगर के साथ करवाने के लिए संभव है?
अभिवादन, टॉम
संपादित करें:
मैं MacOSX पर हूँ, मैं सिर्फ मेरे दोस्त लिनक्स पर इस चलाते हैं, और वह वास्तव में परिणाम मैं प्राप्त करने के लिए कामना की प्राप्त करता है। उसकी सॉकेट.कनेक्ट्स() की वापसी तुरंत, एक गैर थ्रेडेड वातावरण में भी। और यहां तक कि जब वह अवरुद्ध करने के लिए सॉकेट सेट करता है, और 10 सेकंड तक टाइमआउट करता है, तो उसके सभी थ्रेड एक ही समय में समाप्त होते हैं।
क्या कोई इसे समझा सकता है?
तुम सिर्फ socket.getaddrinfo का उपयोग कर का प्रयास किया है (मेजबान, बंदरगाह) यह देखने के लिए कि क्या एक ही सीमा है? दुर्भाग्य से मैं इसे दोहराना नहीं कर सकता, क्योंकि यह एक डीएनएस समस्या है। ज्यादातर मामलों में, आपको "gaierror: (-2, 'नाम या सेवा ज्ञात नहीं है')" जल्दी से प्राप्त करना चाहिए। – JimB
हाँ मैंने कोशिश की है, और इसकी एक ही सीमा है। – Tom
मुझे पूरा यकीन है कि ओएसएक्स बीएसडी पुस्तकालयों से getaddrinfo का उपयोग करता है, जो शायद नीचे <मार्टिन बनाम लोविस> द्वारा सूचीबद्ध प्रतिबंध है। – JimB