2009-07-20 2 views
0

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

ответ

2

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

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

+0

Я сомневаюсь в этом: поэтому TCP-сокеты буферизуются. Я должен буду дать ему попробовать из любопытства, но я бы ожидал, что буферизация сокетов позаботится об этом по большей части. –

+0

Я прочитал эту страницу, и она выглядит очень полезной, я могу попытаться использовать Twisted, если не могу найти ничего проще, спасибо. – 2009-07-20 20:07:54

+0

Upvote для скрученной рекомендации. Намного проще писать и отлаживать код, который использует скрученный, чем для эквивалентного кода с резьбой. – habnabit

0

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

1

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

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

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

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

+0

Я проверил, и все темы запускаются одновременно и работают параллельно, но все они возвращаются из запроса urllib в разное время. Я предполагаю, что он имеет какое-то отношение к сети и обрабатывает сразу несколько запросов. Считаете ли вы, что это проблема или это что-то еще? Можно ли сразу запустить несколько сетевых запросов? Я нахожусь на windows xp, и у меня есть беспроводное соединение, если это помогает. Спасибо за вашу помощь и извините мое невежество, я не очень люблю сетевого человека. – 2009-07-20 20:07:07