Python сразу обращается к нескольким веб-страницам

У меня есть tkinter GUI, который загружает данные с нескольких сайтов одновременно. Я запускаю отдельный поток для каждой загрузки (около 28). Это слишком много потоков для одного процесса GUI? потому что он очень медленный, каждая отдельная страница занимает от 1 до 2 секунд, но когда все запускаются сразу, это занимает более 40 секунд. Есть ли способ сократить время, необходимое для загрузки всех страниц? Любая помощь приветствуется, спасибо.

Ответ 1

Вероятно, GIL (глобальный блокиратор интерпретатора), который мешает вам. У Python есть некоторые проблемы с производительностью со многими потоками.

Вы можете попробовать twisted.web.getPage(см. http://twistedmatrix.com/projects/core/documentation/howto/async.html немного вниз по странице). У меня нет тестов для этого. Но, взяв пример на этой странице и добавив 28 отсрочек, чтобы увидеть, как быстро это даст вам сопоставимый результат довольно быстро. Имейте в виду, что вам нужно будет использовать реактор gtk и использовать стиль программирования twisteds.

Ответ 2

Процесс может иметь сотни потоков на любой современной ОС без каких-либо проблем.

Если вы ограничены полосой пропускания, от 1 до 2 секунд 28 означает, что 40 секунд - это правильно. Если у вас латентность ограничена, она должна быть быстрее, но без информации все, что я могу предложить, это:

  • добавить журнал в свой код, чтобы убедиться, что он фактически работает параллельно, и что вы случайно не сериализуете свои потоки;
  • используйте сетевой монитор, чтобы убедиться, что сетевые запросы фактически выходят параллельно.

Трудно дать что-нибудь лучше без дополнительной информации.

Ответ 3

Вы можете попробовать использовать процессы вместо потоков. Python имеет GIL, который может вызвать некоторые задержки в вашей ситуации.