Python Socket и Thread pooling, как повысить производительность? - PullRequest
3 голосов
/ 07 июля 2011

Я пытаюсь реализовать базовую библиотеку для выдачи HTTP GET запросов.Моя цель - получать данные через сокетные соединения - минималистичный дизайн для улучшения производительности - использование с потоками, пулами потоков .

У меня есть несколько ссылок, которые я группирую по их именам хостов, поэтому вот простая демонстрация входных URL:

hostname1.com - 500 links
hostname2.org - 350 links
hostname3.co.uk - 100 links
...

Я намерен использовать сокеты из-за проблем с производительностью.Я намерен использовать несколько сокетов, которые поддерживают связь (если это возможно и обычно так и есть) и отправлять HTTP-запросы GET.Идея возникла из-за низкой производительности urllib при непрерывных запросах, потом я встретился с urllib3, потом понял, что он использует httplib, а затем решил попробовать сокеты.Итак, вот что я выполнил до сих пор:

класс GETSocket, класс SocketPool, классы ThreadPool и Worker

класс GETSocket - минимизированная версия "только для HTTP GET" Python.httplib.

Итак, я использую эти классы следующим образом:

sp = Comm.SocketPool(host,size=self.poolsize, timeout=5)
for link in linklist:
    pool.add_task(self.__get_url_by_sp, self.count, sp, link, results)
    self.count += 1
    pool.wait_completion()
    pass

__get_url_by_sp - это обертка, которая вызывает sp.urlopen и сохраняет результат в списке results.Я использую пул из 5 потоков, который имеет пул сокетов из 5 классов GETSocket.

Что мне интересно, есть ли другой возможный способ улучшить производительность этой системы?

Я читал об асинхронном здесь , но я не мог понять, как использовать такое же сокетное соединение с предоставленным class HTTPClient(asyncore.dispatcher).

Еще один момент, я не знаю, могу ли яm используя блокирующий или неблокирующий сокет, который был бы лучше для производительности или как реализовать какой.

Пожалуйста, определитесь с вашим опытом, Я не собираюсь импортировать другую библиотеку сделать только HTTP GET, поэтому я хочу написать свою собственную крошечную библиотеку.

Любая помощь приветствуется, спасибо.

Ответы [ 2 ]

3 голосов
/ 07 июля 2011

Сделай это.

Использование multiprocessing.http://docs.python.org/library/multiprocessing.html.

  1. Напишите работника Process, который помещает все URL в Queue.

  2. Напишите работнику Process который получает URL от Queue и выполняет GET, сохраняя файл и помещая информацию о файле в другую очередь.Возможно, вам понадобится несколько копий этого Process.Вам нужно будет поэкспериментировать, чтобы узнать, сколько верного числа.

  3. Напишите рабочий Process, который читает информацию о файле из Queue и делает все, что вы 'пытаюсь сделать.

2 голосов
/ 25 августа 2011

Я наконец-то нашел правильный путь для решения своих проблем. Я использовал Python 3 для своего проекта, и мой единственный вариант - использовать pycurl, поэтому мне пришлось перенести мой проект обратно на Python 2.7 series.

Используя pycurl, я получил: - Последовательные ответы на мои запросы (на самом деле мой скрипт должен иметь дело с URL-адресами не менее 10 тыс.) - С использованием класса ThreadPool я получаю ответы так быстро, как может моя система (полученные данные обрабатываются позже - поэтому многопроцессорная обработка здесь маловероятна)

Сначала я попробовал httplib2, я понял, что он работает не так хорошо, как на Python 2, переключившись на pycurl, я потерял поддержку кэширования.

Окончательный вывод: когда дело доходит до HTTP-коммуникации, может понадобиться инструмент, подобный (py) curl, в его распоряжении. Это спасение жизни, особенно когда приходится иметь дело с множеством URL-адресов (попробуйте иногда для удовольствия: вы получите много странных ответов от них)

Спасибо за ответы, ребята.

...