Parallelism em python não está funcionando direito
I estava desenvolvendo um aplicativo no gae usando python 2.7, uma chamada ajax solicita alguns dados de uma API, uma única solicitação pode demorar ~ 200 ms, no entanto, quando abro dois navegadores e faço duas solicitações em um momento muito próximo, elas demoram mais do que o dobro disso, tentei colocar tudo em threads, mas não funcionou .. (isso acontece quando o aplicativo está online, não apenas no servidor dev)
Então eu escrevi este teste simples para ver se isso é um problema em python em geral (no caso de uma espera ocupada), aqui está o código e o 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()
O resultado no mac os x, core i7 (4 núcleos, 8 threads), 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
Isto é bastante chocante !! se um único encadeamento levasse 5 segundos para fazer isso. Pensei que iniciar dois encadeamentos ao mesmo tempo levaria o mesmo tempo para concluir as duas tarefas, mas leva quase o triplo do tempo. Isso torna inútil toda a ideia de encadeamento, como seria mais rápido fazê-las sequencialmente!
O que estou perdendo aqui.