Python Interpreter bloquea solicitudes de DNS multiproceso?
Simplemente jugué un poco con python y subprocesos, y me di cuenta de que, incluso en un script multiproceso, las solicitudes de DNS están bloqueando. Considere el siguiente script:
de subprocesos importación importación de subprocesos socket
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()
No sé exactamente cuánto tiempo dura el tiempo de espera, pero cuando se ejecuta esto sucede lo siguiente:
Todos los hilos comienzan y recibo mis impresionesCada xx segundos, se muestra un hilo, en lugar de todos a la vezLos hilos terminan secuencialmente, no todos a la vez (tiempo de espera = ¡igual para todos!)Así que mi única conjetura es que esto tiene que ver con la GIL? Obviamente, los subprocesos no realizan su tarea simultáneamente, solo se intenta una conexión a la vez.
¿Alguien sabe una manera de evitar esto?
(asyncore No ayuda, y prefiero no usarretorcido por ahora) ¿No es posible hacer esta pequeña cosa simple con python?
Saludos tom
editar:Estoy en MacOSX, solo dejo que mi amigo ejecute esto en Linux y él realmente obtiene los resultados que deseaba obtener. Su socket.connects () regresa inmediatamente, incluso en un entorno sin hilos. E incluso cuando configura los zócalos para el bloqueo y el tiempo de espera de 10 segundos, todos sus subprocesos terminan al mismo tiempo.
¿Alguien puede explicar esto?