У меня есть tkinter GUI, который загружает данные с нескольких сайтов одновременно. Я запускаю отдельный поток для каждой загрузки (около 28). Это слишком много потоков для одного процесса GUI? потому что он очень медленный, каждая отдельная страница должна занимать от 1 до 2 секунд, но когда все запускаются сразу, это занимает более 40 секунд. Есть ли способ сократить время, необходимое для загрузки всех страниц? Любая помощь приветствуется, спасибо.Python, доступ к нескольким веб-страницам сразу
ответ
Это, вероятно, GIL (глобальный шлюз интерпретатора), который мешает вам. У Python есть некоторые проблемы с производительностью со многими потоками.
Вы можете попробовать twisted.web.getPage (см. http://twistedmatrix.com/projects/core/documentation/howto/async.html немного вниз по странице). У меня нет ориентиров. Но, взяв пример на этой странице и добавив 28 отложенных сообщений, чтобы увидеть, как быстро это даст вам сопоставимый результат довольно быстро. Имейте в виду, что вам придется использовать реактор gtk и вникнуть в стиль программирования Twisteds.
Вы можете попробовать использовать процессы вместо потоков. Python имеет GIL, который может вызвать некоторые задержки в вашей ситуации.
Процесс может иметь сотни потоков на любой современной ОС без каких-либо проблем.
Если вы ограничены полосой пропускания, от 1 до 2 секунд 28 означает, что 40 секунд - это правильно. Если вы латентности ограничены, он должен быть быстрее, но без информации, все, что я могу предложить:
- добавить вход в свой код, чтобы убедиться, что он на самом деле работает параллельно, и что вы не случайно сериализация ваших потоков как-то;
- используйте сетевой монитор, чтобы убедиться, что сетевые запросы фактически выходят параллельно.
Трудно дать что-либо лучше без дополнительной информации.
Я проверил, и все темы запускаются одновременно и работают параллельно, но все они возвращаются из запроса urllib в разное время. Я предполагаю, что он имеет какое-то отношение к сети и обрабатывает сразу несколько запросов. Считаете ли вы, что это проблема или это что-то еще? Можно ли сразу запустить несколько сетевых запросов? Я нахожусь на windows xp, и у меня есть беспроводное соединение, если это помогает. Спасибо за вашу помощь и извините мое невежество, я не очень люблю сетевого человека. – 2009-07-20 20:07:07
Я сомневаюсь в этом: поэтому TCP-сокеты буферизуются. Я должен буду дать ему попробовать из любопытства, но я бы ожидал, что буферизация сокетов позаботится об этом по большей части. –
Я прочитал эту страницу, и она выглядит очень полезной, я могу попытаться использовать Twisted, если не могу найти ничего проще, спасибо. – 2009-07-20 20:07:54
Upvote для скрученной рекомендации. Намного проще писать и отлаживать код, который использует скрученный, чем для эквивалентного кода с резьбой. – habnabit