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:
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
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?
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.
Wenn es geeignet ist, könnten Sie das Modul multiprocessing
verwenden, um prozessbasierte Parallelität zu aktivieren
Tags und Links python multithreading network-programming