Уведомления

Группа в Telegram: @pythonsu

#1 Июль 24, 2019 09:04:33

Sasha_2020
Зарегистрирован: 2019-07-24
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Добавить многопоточность в чекер заголовков headers http

Здраствуйте,
у меня Python 3 Windows 7
Этот код перебирает из файла список прокси и чекает их по заголовку,
работает как нужно только скорости маловато..
помогите пожалуйта добавить в этот код многопоточность (хоть на 10 потоков)
очень нужно!

 import requests
headers = {
            'Connection':'keep-alive',
            'User-Agent':'DuneHD/1.0.3 SmartLabs Smartsdk Smart TV/Apple TV Linux',
            'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
            'Accept-Encoding':'gzip, deflate, lzma, sdch',
            'Accept-Language':'ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4',
            'Upgrade-Insecure-Requests':'1',
            'DNT':'1',
           }
     
with open ("Out.txt","a") as f:
    error = ''
    for line in open('IPs.txt'):
        try:
            line = line.strip()
            req = requests.get(line,headers=headers,timeout=(2,2))
            status = req.status_code
            server = req.headers.get('Server','')
            f.write(' '.join([server,line,'\n']))
        except requests.exceptions.RequestException as err:
            status = ''
            error = err
        finally:
            print('{:30}:{:3}:{}'.format(line,status,error or server))

Вот текст (Proxy) с файла IPs.txt
http://31.148.103.65:81
http://93.125.53.105:8086
http://82.209.197.187:8080
http://178.151.158.252:8080
http://37.194.224.203:81
http://188.35.9.26:2051
http://31.148.16.31:8080
http://185.23.64.14:8080
http://87.145.189.129:9981

Отредактировано Sasha_2020 (Июль 24, 2019 09:33:16)

Офлайн

#2 Июль 25, 2019 08:36:19

Striver
От:
Зарегистрирован: 2006-10-26
Сообщения: 247
Репутация: +  22  -
Профиль   Отправить e-mail  

Добавить многопоточность в чекер заголовков headers http

У меня что-то такое получилось:

 import requests
from multiprocessing.dummy import Pool as ThreadPool
from queue import Queue
headers = {
            'Connection':'keep-alive',
            'User-Agent':'DuneHD/1.0.3 SmartLabs Smartsdk Smart TV/Apple TV Linux',
            'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
            'Accept-Encoding':'gzip, deflate, lzma, sdch',
            'Accept-Language':'ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4',
            'Upgrade-Insecure-Requests':'1',
            'DNT':'1',
           }
           
THREADS = 10    
 
   
q_out = Queue()    
 
 
def test_host(host):
    error = ''
    try:
        host = host.strip()
        req = requests.get(host, headers=headers, timeout=(2,2))
        status = req.status_code
        server = req.headers.get('Server','')
        q_out.put(' '.join([server, host, '\n']))
    except requests.exceptions.RequestException as err:
        status = ''
        error = err
    finally:
        print('{:30}:{:3}:{}'.format(host, status, error or server))
    
pool = ThreadPool(THREADS)
lines = open('IPs.txt').readlines()
pool.map(test_host, lines)
 
with open ("Out.txt","a") as f:
    while not q_out.empty():
        f.write(q_out.get())



Отредактировано Striver (Июль 25, 2019 08:38:24)

Офлайн

#3 Июль 25, 2019 10:05:41

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Добавить многопоточность в чекер заголовков headers http

Sasha_2020
добавить в этот код многопоточность
Striver
У меня что-то такое получилось:
Да, так можно сделать НО.

Я думаю это классический случай кривой постановки задачи.
Sasha_2020
как нужно только скорости маловато..

Т.е. реально нужно “решить задачу быстрее” а не “добавить многопоточность”.

Многопоточность это средство а не цель. Если их путать получится неэффективный код как у вас.

Что тормозит? Отклик прокси. Как это решают? Написанием асинхронного кода а не параллельного. В том коде что у вас 10 потоков это норм а 1000 уже напряжно для ОС по памяти и переключения будут медленные.

:) Но.
Именно “добавить в этот код” не получится. Чтобы он стал асинхронным requests нельзя использовать, обработку ошибок надо по другому делать и т. д. и.т.п. Т.е. от вашего кода ровно ничего не останется. Это уж никак не добавить.

Стоит ли делать все переделывать асинхронно (например чтобы поучиться) это вам решать.
https://docs.python.org/3/library/asyncio.html
https://docs.python.org/3/library/asyncio-queue.html#asyncio-queues
https://aiohttp.readthedocs.io/en/stable/client_quickstart.html#make-a-request

p.s.
Если делать на потоках, то такие задачи обычно решаются очередями.
https://docs.python.org/3/library/queue.html
http://snakeproject.ru/rubric/article.php?art=python_threading



Отредактировано doza_and (Июль 25, 2019 10:11:00)

Офлайн

#4 Июль 25, 2019 21:17:41

Sasha_2020
Зарегистрирован: 2019-07-24
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Добавить многопоточность в чекер заголовков headers http

doza_and
Огромное спасибо всем кто откликнулся!
Striver
У меня что-то такое получилось:
Работает уже намного быстрей!
Но заметил есть какой-то баг - при обработки большого обьема ссылок (около 1000)
где-то под конец работы начинает замедлятся и останавливается совсем!?
Не срабатывает обработка ошибок иле может уменьшить время на операцию?

У меня пока очень мало опыта в таких тонкостях..
Если не трудно я был бы очень благодарен любым вариантам с асинхронностю такого скрипта!

Отредактировано Sasha_2020 (Июль 25, 2019 23:31:21)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version