Estaba desarrollando una aplicación en gae usando python 2.7, una llamada ajax solicita algunos datos de una API, una sola solicitud podría tomar ~ 200 ms, sin embargo, cuando abro dos navegadores y hago dos las solicitudes en un momento muy cercano toman más del doble de eso, intenté poner todo en hilos pero no funcionó ... (esto sucede cuando la aplicación está en línea, no solo en el servidor dev)Paralelismo en python no funciona bien
Así que escribí esta sencilla prueba para ver si esto es un problema en pitón en general (en el caso de una espera de ocupado), aquí está el código y el resultado:
def work():
t = datetime.now()
print threading.currentThread(), t
i = 0
while i < 100000000:
i+=1
t2 = datetime.now()
print threading.currentThread(), t2, t2-t
if __name__ == '__main__':
print "single threaded:"
t1 = threading.Thread(target=work)
t1.start()
t1.join()
print "multi threaded:"
t1 = threading.Thread(target=work)
t1.start()
t2 = threading.Thread(target=work)
t2.start()
t1.join()
t2.join()
el resultado en Mac OS X, do ore i7 (4 núcleos, 8 hilos), python2.7:
single threaded:
<Thread(Thread-1, started 4315942912)> 2011-12-06 15:38:07.763146
<Thread(Thread-1, started 4315942912)> 2011-12-06 15:38:13.091614 0:00:05.328468
multi threaded:
<Thread(Thread-2, started 4315942912)> 2011-12-06 15:38:13.091952
<Thread(Thread-3, started 4323282944)> 2011-12-06 15:38:13.102250
<Thread(Thread-3, started 4323282944)> 2011-12-06 15:38:29.221050 0:00:16.118800
<Thread(Thread-2, started 4315942912)> 2011-12-06 15:38:29.237512 0:00:16.145560
Esto es bastante impactante !! si un solo hilo tomaría 5 segundos para hacer esto ... pensé que iniciar dos hilos al mismo tiempo tomaría el mismo tiempo para terminar ambas tareas, pero lleva casi el triple de tiempo ... esto hace que toda la idea de enhebrar sea inútil, como ¡sería más rápido hacerlos secuencialmente!
lo que me estoy perdiendo aquí ..
¿Has leído algo sobre Global Interpreter Lock (GIL) en Python? Si desea un procesamiento paralelo, debe considerar el multiprocesamiento, no el enhebrado. La ejecución está limitada a un único hilo a la vez a menos que las bibliotecas con las que está trabajando estén diseñadas específicamente para liberar el GIL. –
Su punto de referencia está mal diseñado.Su caso de uso real estará vinculado a IO, no a CPU. Python's GIL se comporta de manera bastante diferente en cada caso. Enhebrar * debería * funcionar bien para usted en su caso de uso real. – zeekay
@ g.d.d.c. el multiprocesamiento no está disponible dentro de GAE – bpgergo