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, который может вызвать некоторые задержки в вашей ситуации.