@stayHARD

Многопоточная обработка страниц используя Python3+Grab. Как?

Здравствуйте.
Возникла необходимость написать достаточно простой обработчик сайтов(не парсер!).
Одна из самых главных деталей - многопоточность и быстродействие.
Сейчас написан вот такой код:
from queue import Queue
from threading import Thread
import time
from grab import Grab


def submit_form(i, q):
    while True:
        link = q.get()
        g = Grab()
        g.go(link)
        # Some actions with page 
        q.task_done()

start_time = time.time()
num_threads = 5
queue = Queue()

for i in range(num_threads):
    worker = Thread(target=submit_form, args=(i, queue))
    worker.setDaemon(True)
    worker.start()

q = [
"link1",
....
"link100"
]

for item in q:
    queue.put(item)

queue.join()
print("--- %s seconds ---" % (time.time() - start_time))

В листе q лежит ~100 ссылок, которые нужно обработать параллельно, независимо друг от друга.
Сейчас в 5 потоков данное чудо отрабатывает за ~50 секунд(Достаточно неплохо вроде, да?)
Когда ставлю 30 потоков(Нужно больше, потому что со временем ссылок будет в разы больше) получаю
grab.error.GrabConnectionError: [Errno 7] Failed to connect to линк_на_сайт port 80: Connection refused

С чем это может быть связано и как можно еще улучшить отработку скрипты?
Спасибо за советы :)

UPD:
Почитав немного информацию по запросу connection refused python, я сделал вывод, что я не могу создавать больше чем 1 коннекшн в течении одной секунды. Так ли это?
  • Вопрос задан
  • 1172 просмотра
Пригласить эксперта
Ответы на вопрос 3
sim3x
@sim3x
Забудь про граб

Или используй питон2 и scrapy, или используй питон3 с его плюшками, или просто запускай параллельно синхронные скрипты с помощью parallel

cat file_with_links.txt | \
     parallel -j количество_потоков myscript.py --param1={}
Ответ написан
Комментировать
mututunus
@mututunus
Backend developer (Python, Golang)
Используйте aiohttp.
Ответ написан
@GetData
> Когда ставлю 30 потоков(Нужно больше, потому что со временем ссылок будет в разы больше) получаю

На веб-сайте или backend не может больше 30 коннешнов одновременных держать или firewall/веб-сервер настроен так, чтобы ограничивать кол-во коннекшнов.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы