Я немного поигрался с питоном и потоками и понял, что даже в многопоточном скрипте 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()
Я не знаю точно, как долго тайм-аут, но при запуске это происходит следующее:
- Все темы начинаются, и я получаю свои распечатки
- Каждые xx секунды один поток отображает завершенный, а не все сразу
- Потоки заканчиваются последовательно, не все сразу (время ожидания = одинаково для всех!)
Так что мое единственное предположение, что это имеет отношение к GIL? Очевидно, что потоки не выполняют свою задачу одновременно, одновременно выполняется только одно соединение.
Кто-нибудь знает способ обойти это?
( asyncore не помогает, и я бы предпочел не использовать twisted сейчас)
Разве нельзя сделать эту простую маленькую вещь с помощью Python?
Привет, Том
редактирование:
Я нахожусь на MacOSX, я просто позволил моему другу запустить это на linux, и он действительно получил результаты, которые я хотел получить. Его socket.connects () немедленно возвращается, даже в не поточной среде. И даже когда он устанавливает сокеты на блокировку и тайм-аут на 10 секунд, все его потоки заканчиваются одновременно.
Может кто-нибудь объяснить это?