Задать вопрос
reapersuper14
@reapersuper14
Python-программист-студент. Учусь делать круто.

Спасет ли меня многопоточность?

Всем добрый день.

Пишу одно приложеньице на Django и Grab'e. Оно отправляет ОЧЕНЬ много запросов серверам в интернетах и сохраняет спарсеные данные ответов в бд. Оригинальные данные обновляются на серверах почти непрерывно. Сейчас, на локальном сервере, весь экшн запускается по моей команде, но в продакшене я хочу сделать это непрерывным процессом (загрузил ответ, фоном спарсил, сохранил в базу, опять загружать и парсить пошел - никто и не заметил).

Вопрос в следующем:
Т.к. количество исходящих от меня http запросов просто зашкаливает, скорость работы однопоточного скрипта не очень радует.
Хотелось бы узнать, есть ли какой-то способ существенно ускорить мой скрипт? Я не очень хорошо разбираюсь в потоках, но подумал, что возможно есть способ делегировать им часть моих запросов... Ведь, если рассуждать логически, те сервера в интернете, куда я шлю столько запросов, получают их в сотни раз больше от разных пользователей, и успевают на все отвечать. Да, у них лучше железо и шире канал связи, но только ли в этом дело?

P.S. Если Вы, возможно, не поняли мой вопрос или считаете, что данную тему невозможно раскрыть в рамках Тостера, посоветуйте книжку, где объясняется, как вот такие непростые web-сервисы строить.
  • Вопрос задан
  • 761 просмотр
Подписаться 1 Оценить 1 комментарий
Решения вопроса 2
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
много потоков это хорошо, но с ростом количества потоков производительность будет падать ну то есть 8 потоков будут работать не в два раза быстрее чем 4.

У вас по сути большая часть времени - это работа с сетью, что медленно. Выход - event loop. В рамках одного потока запускаем много много неблокируемых запроса, и по мере завершения запросов обрабатываем результат.

Комбинация нескольких потоков (по количеству ядер процессора) и event loop даст максимальную утилизацию процессора.
Ответ написан
@stayHARD
Только закончил написание многопоточного скрипта-парсера на Grab.
Для этого использовал Grab Spider - docs.grablib.org/en/latest/spider/intro.html
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
Olej
@Olej
инженер, программист, преподаватель
Я не очень хорошо разбираюсь в потоках, но подумал, что возможно есть способ делегировать им часть моих запросов...

Много потоков в Python - это фикция ... за счёт GIT.
В Python исполнение в несколько потоков не ускоряет, а замедляет итоговое выполнение программы ... что бы вам тут не дудели умники.
Ответ написан
MAKAPOH
@MAKAPOH
многостаночник
Хотелось бы узнать, есть ли какой-то способ существенно ускорить мой скрипт?

Попробуйте для запросов в сеть использовать aiohttp. Это библиотека на основе событийного цикла про который писал Сергей Протько . Будет ли ускорение радикальным не знаю, но то что оно будет уверен почти на 100%.
Ответ написан
Комментировать
reapersuper14
@reapersuper14 Автор вопроса
Python-программист-студент. Учусь делать круто.
Решил проблему, переписав все с помощью Grab::Spyder.
Отлично работает, судя по временным замерам.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы