Параллелизм в python работает неправильно

Я разрабатывал приложение на gae, используя python 2.7, вызов ajax запрашивает некоторые данные из API, один запрос может занять ~ 200 мс, однако, когда я открываю два браузера и сделать два запроса в очень близкое время, они занимают больше, чем вдвое, я пробовал поместить все в потоки, но это не сработало .. (это происходит, когда приложение находится в сети, а не только на dev-сервере)

Итак, я написал этот простой тест, чтобы увидеть, является ли это проблемой для Python в целом (в случае активного ожидания), вот код и результат:

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()

Результат на mac os x, core i7 ( 4 ядра, 8 потоков), 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

Это шокирует !! если одному потоку потребуется 5 секунд, чтобы сделать это ... Я думал, что запуск двух потоков одновременно займет одно и то же время, чтобы завершить обе задачи, но это займет почти втрое больше времени .. это делает всю идею потоковой передачи бесполезной, поскольку быстрее было бы делать их последовательно!

чего мне здесь не хватает ..

7
задан Mohamed Khamis 6 December 2011 в 17:01
поделиться