Interpretador do Python bloqueia solicitações de DNS multithreaded?
Eu apenas brinquei um pouco com python e threads, e percebi que mesmo em um script multiencadeado, as solicitações de DNS estão bloqueando. Considere o seguinte script:
de threading import Importação de linha
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()
Eu não sei exatamente quanto tempo o tempo limite é, mas quando executando isso acontece o seguinte:
Todos os Threads começam e eu recebo minhas impressõesA cada xx segundos, um thread é exibido concluído, em vez de tudo de uma vezOs Threads terminam sequencialmente, não todos de uma vez (timeout = same for all!)Então, meu único palpite é que isso tem a ver com a GIL? Obviamente, os encadeamentos não executam suas tarefas simultaneamente, apenas uma conexão é tentada de cada vez.
Alguém sabe uma maneira de contornar isso?
(assíncrona não ajuda, e prefiro não usartorcido por enquanto) Não é possível fazer essa pequena coisa simples com python?
Saudações, Tom
editar:Eu estou no MacOSX, eu apenas deixo meu amigo rodar isso no linux, e ele realmente consegue os resultados que eu queria. Seu socket.connects () retorna imediatamente, mesmo em um ambiente não Threaded. E mesmo quando ele coloca os soquetes para bloquear e tempo limite de 10 segundos, todos os seus Threads terminam ao mesmo tempo.
Alguém pode explicar isso?