Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ограничение скорости скачивания, Для скрипта на питоне 
:(
    Опции темы
Alex13
Дата 24.1.2009, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 280
Регистрация: 30.12.2005
Где: Новосибирск

Репутация: нет
Всего: 1



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

Есть ли в питоне модули, которые позволяют это сделать? Поскольку речь идет об HTTP, желательно, чтобы модуль поддерживал работу с оным на достаточно высоком уровне (в духе curl), или были соответствующие надстройки над ним.


--------------------
Самая страшная ошибка - это ошибка, не имеющая явных причин и конкретных последствий.
Антисоциальный блог.
PM WWW ICQ Jabber   Вверх
pythonwin
Дата 29.1.2009, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



PM WWW GTalk Jabber   Вверх
Alex13
Дата 29.1.2009, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 280
Регистрация: 30.12.2005
Где: Новосибирск

Репутация: нет
Всего: 1



pythonwin, это строго противоположная задача smile
По вашим ссылкам решалась проблема ограничения скорости отдачи файла пользователю, а мне нужно ограничить скорость приема с моей стороны.


--------------------
Самая страшная ошибка - это ошибка, не имеющая явных причин и конкретных последствий.
Антисоциальный блог.
PM WWW ICQ Jabber   Вверх
pythonwin
Дата 29.1.2009, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



учитывая что Иван использовал не собственные разработки, а готовые и довольно рапрастраненные библиотеки, считаю что Вам просто необходимо попробовать его метод только со знаком в обратную сторону.
Цитата

Довольно быстро я понял, что это как раз то, что мне надо. Действительно, вся невеликая логика, которая мне нужна для обработки запроса -- это авторизация пользователя по логину с паролем и арифметика ограничения скорости скачивания. Все это недолгие операции, а значит принципиально это работать должно.

Но самое, самое-то главное, что при наличии библиотек я могу написать это на Питоне, а значит -- использовать Django! А значит в этом отдельном сервере скачивания смогу использовать всю свою уже имеющуюся логику авторизации, проверки прав, поиска файлов альбома. Плюс, там же будут работать мои и Django'вские middleware-фильтры. Короче говоря, я уже имею всю нужную инфраструктуру. Осталось написать только раздачу в сокеты.

Библиотечка asyncore оказалась довольно таки удобной. Все, что потребовалось от меня -- это повесить свои функции на события "handle_read", "handle_write", "handle_close", которые библиотека сама запускает, когда сокеты готовы принимать и отдавать данные, и когда закрываются. В эти обработчики я свалил всю свою логику по откусыванию кусочков от файла и ограничению скорости. И даже разбор HTTP-запроса мне не пришлось писать самостоятельно, потому что с Медузой очень удачно поставляется пример HTTP-сервера, из которого я стащил все то немногое, что надо сделать перед тем, как сформировать Django'вский HttpRequest.

Кстати, после того, как я познакомился с Meduse/asyncore, я, опять же впервые для себя, наткнулся у Pythy на описание библиотечки Twisted, которая, похоже, умеет делать то же самое, но более развита. Это так? Где почитать?

В итоге, сервер где-то за неделю был написан и отлажен. И работал, выдерживая и по 100, и по 200 пользователей с неограниченным трафиком. При этом CPU загружался не больше, чем на 50-60% процентов в пике.

Что еще приятно, из-за того, что теперь весь код сервера был полностью в моих руках, удалось решить множество мелких и не очень проблем:

    *     Раньше в итераторе приходилось записывать количество скачанных байт на каждой итерации, потому что по окончании передачи (удачном или неудачном) ничто не сигнализировало итератору о том, что надо что-то закрывать. Теперь, поскольку и саму передачу делаю я, я могу гарантировано знать ее окончание и делать всю статистику один раз в конце.
    *      По той же причине я точно знаю, сколько байт передано, поэтому пропала нужда в сомнительном решении с фиксацией окончания скачивания на один шаг раньше его реального окончания (подробнее см. первую часть триллера).
    *      Особая вкусность: имея в одном процессе все соединения, я могу знать, какие пользователи что качают в данный момент и выдавать такую статистику:


Это сообщение отредактировал(а) pythonwin - 29.1.2009, 13:09
PM WWW GTalk Jabber   Вверх
FooBar
Дата 29.1.2009, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 25.2.2008

Репутация: нет
Всего: 3



Alex13,  посмотрите pycurl и его опции http://curl.haxx.se/libcurl/c/curl_easy_setopt.html
PM MAIL   Вверх
Fenrir13
Дата 30.1.2009, 07:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 20.9.2008

Репутация: 1
Всего: 2



Alex13, для описанной задачи должны сгодиться CURLOPT_MAX_SEND_SPEED_LARGE и CURLOPT_MAX_RECV_SPEED_LARGE из curl'а.

FooBar, pythonwin, а если также хочется ограничить нагрузку на запрашиваемые сайты? Не стучаться к одному домену чаще N раз в секунду/минуту, например? Можно ли добиться этого средствами curl? Описание опций не помогло.
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0618 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.