Python Interpreter блокирует многопоточные 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()

Я не знаю точно, как долго это время ожидания, но при выполнении этого происходит следующее:

All Threads start and I get my printouts Every xx seconds, one thread displays finished, instead of all at once The Threads finish sequentially, not all at once (timeout = same for all!)

Так что мое единственное предположение, что это связано с GIL? Очевидно, что потоки не выполняют свою задачу одновременно, одновременно выполняется только одно соединение.

Кто-нибудь знает способ обойти это?

(asyncore не помогает, и я предпочитаю не использоватьtwisted теперь) Разве это не возможно сделать эту простую маленькую вещь, сделанную с python?

Привет, Том

edit:

Я нахожусь на MacOSX, я просто позволил своему другу запустить это на linux, и он действительно получил результаты, которые я хотел получить. Его socket.connects () возвращается немедленно, даже в не поточной среде. И даже когда он устанавливает сокеты на блокировку и тайм-аут на 10 секунд, все его потоки заканчиваются одновременно.

Кто-нибудь может объяснить это?

Ответы на вопрос(3)

Ваш ответ на вопрос