Python Interpreter blockiert Multithread DNS Anfragen?

8

Ich habe gerade ein wenig mit Python und Threads herumgespielt und festgestellt, dass auch in einem Multithread-Skript DNS-Anfragen blockiert werden. Betrachten Sie das folgende Skript:

vom Threading-Import Thread Buchse importieren

%Vor%

Ich weiß nicht genau, wie lange das Timeout ist, aber beim Ausführen passiert Folgendes:

  1. Alle Threads starten und ich bekomme meine Ausdrucke
  2. In jedem xx Sekunden wird ein Thread beendet und nicht auf einmal
  3. angezeigt
  4. Die Threads enden nacheinander, nicht alle auf einmal (Timeout = für alle!)

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?

( asyncore hilft nicht, und ich würde es vorziehen, twisted für jetzt nicht zu verwenden) Ist es nicht möglich, diese einfache kleine Sache mit Python zu erledigen?

Grüße, Tom

editieren:

Ich bin auf MacOSX, ich lasse meinen Freund das unter Linux laufen, und er bekommt tatsächlich die Ergebnisse, die ich bekommen wollte. Seine socket.connects () werden sofort zurückgegeben, auch in einer Umgebung ohne Threads. Und selbst wenn er die Sockets auf Sperren setzt und Timeouts auf 10 Sekunden setzen, werden alle Threads gleichzeitig beendet.

Kann jemand das erklären?

    
Tom 31.07.2009, 14:03
quelle

3 Antworten

15

Bei einigen Systemen ist getaddrinfo nicht threadsicher. Python glaubt, dass einige dieser Systeme FreeBSD, OpenBSD, NetBSD, OSX und VMS sind. Auf diesen Systemen behält Python eine Sperre speziell für die netdb bei (d. H. Getaddrinfo und Freunde).

Wenn Sie also nicht zwischen Betriebssystemen wechseln können, müssen Sie eine andere (threadsichere) Resolver-Bibliothek verwenden, z. B. twisted.

    
Martin v. Löwis 31.07.2009, 14:23
quelle
2

Wenn es geeignet ist, könnten Sie das Modul multiprocessing verwenden, um prozessbasierte Parallelität zu aktivieren

%Vor%     
Joe Koberg 05.08.2009 17:15
quelle
1

Senden Sie DNS-Anfragen asynchron mit Twisted Names :

%Vor%     
jfs 17.11.2010 23:29
quelle