Python-Interpreter blockiert Multithread-DNS-Anforderungen?

Ich habe nur ein bisschen mit Python und Threads rumgespielt und festgestellt, dass DNS-Anfragen auch in einem Multithread-Skript blockieren. Betrachten Sie das folgende Skript:

vom Threading-Import Thread-Import-Socket

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

Ich weiß nicht genau, wie lange das Timeout dauert, aber wenn ich das starte, passiert folgendes:

Alle Themen beginnen und ich bekomme meine AusdruckeAlle xx Sekunden wird ein Thread beendet angezeigt, anstatt alle gleichzeitigDie Threads werden nacheinander beendet, nicht alle auf einmal (Timeout = für alle gleich!)

Also meine einzige Vermutung ist, dass dies mit der GIL zu tun hat? Offensichtlich führen die Threads ihre Aufgabe nicht gleichzeitig aus, es wird immer nur eine Verbindung versucht.

Kennt jemand einen Weg, um dies zu umgehen?

(asyncore hilft nicht, und ich würde es vorziehen, nicht zu verwendenverdrehte Ist es nicht möglich, diese einfache Kleinigkeit mit Python zu erledigen?

Grüße, Tom

bearbeiten:

Ich bin auf MacOSX, ich lasse nur meinen Freund dies auf Linux laufen, und er bekommt tatsächlich die Ergebnisse, die ich mir gewünscht habe. Seine socket.connects () kehren sofort zurück, auch in einer Umgebung ohne Threading. Und selbst wenn er die Sockets blockiert und das Timeout auf 10 Sekunden setzt, werden alle Threads gleichzeitig beendet.

Kann mir jemand das erklären?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage