Pracowałem nad aplikacją na gae używając Pythona 2.7, wywołanie ajaxa wymaga pewnych danych z API, pojedyncze żądanie może zająć ~ 200 ms, jednak gdy otworzę dwie przeglądarki i zrobię dwa Żądania w bardzo krótkim czasie zabierają więcej niż podwójne, próbowałem umieszczać wszystko w wątkach, ale to nie działało. (dzieje się tak, gdy aplikacja jest w trybie online, nie tylko na serwerze-dev)Paralelizm w Pythonie nie działa poprawnie
Więc napisałem ten prosty test, aby sprawdzić, czy jest to problem w Pythonie w ogóle (w przypadku męczącym oczekiwaniu), tutaj jest kod, a wynik:
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()
wynik na mac oS X do ore i7 (4 rdzenie, 8 wątków), 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
To jest dość szokujące! jeśli pojedynczy wątek zajęłby 5 sekund, aby to zrobić .. Myślałem, że rozpoczęcie dwóch wątków w tym samym czasie zajmie tyle samo czasu, aby ukończyć oba zadania, ale zajmuje to prawie trzy razy więcej czasu. To sprawia, że cały wątek jest bezużyteczny, ponieważ szybciej byłoby je wykonać sekwencyjnie!
co jestem tutaj brakuje ..
Czy czytasz cokolwiek o Globalnej Blokadzie Interpretera (GIL) w Pythonie? Jeśli chcesz równoległe przetwarzanie, powinieneś spojrzeć na proces wieloprocesowy, a nie na wątki. Wykonanie jest ograniczone do jednego wątku na raz, chyba że biblioteki, z którymi pracujesz, są specjalnie zaprojektowane do wydania GIL. –
Twój benchmark jest źle zaprojektowany.Twój rzeczywisty przypadek użycia będzie związany z IO, a nie związany z CPU. Python's GIL zachowuje się zupełnie inaczej w każdym przypadku. Nawlekanie * powinno * działać prawidłowo dla ciebie w rzeczywistym przypadku. – zeekay
@ g.d.d.c. multiprocessing nie jest dostępny w GAE – bpgergo