Что я должен использовать, чтобы ускорить этот код?(Многопроцессорная или многопоточность) - PullRequest
0 голосов
/ 24 января 2019

Не могли бы вы также показать мне, как?Заранее спасибо.

Вот код:

def test():
    with open("proxies.txt", "r") as f:
        for line in f:
            try:
                proxy = line.split('\n', 1)[0]
                r = requests.get('http://www.icanhazip.com/', proxies={'http': 'http://' + proxy}, timeout=1)
                print(r.status_code)
            except (requests.exceptions.ProxyError, requests.exceptions.ConnectTimeout,
                requests.exceptions.ReadTimeout, requests.exceptions.ConnectionError):
                print("Doesn't work")

Многопроцессорная обработка или многопоточность должны запускаться только при вызове функции.

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Два наблюдения:

  1. Вы можете попробовать использовать ThreadPoolExecutor или ProcessPoolExecutor из библиотеки concurrent.futures, чтобы вы могли распараллелить выполнение.

  2. Возможно, вы захотите узнать, ускоряется ли создание явных запросов Session и повторное использование сеанса.Это может сэкономить некоторую стоимость в пересмотре TLS / рукопожатии.Обратите внимание, что вам может потребоваться быть осторожным с cookie-файлами, так как повторно используемые сеансы по умолчанию будут использовать банку cookie.

Не проверено, пример быстрого разбора:

session = requests.Session()
def do_request(line):
    proxy = line.split('\n', 1)[0]
    r = session.get('http://www.icanhazip.com/', proxies={'http': 'http://' + proxy}, timeout=1)
    return r.status_code

with ThreadPoolExecutor(max_workers=8) as executor, \
        open("proxies.txt", "r") as f:
    results = executor.map(do_request, f)
    for future in results:
        try:
            print(future.result())
        except (requests.exceptions.ProxyError, requests.exceptions.ConnectTimeout,
                requests.exceptions.ReadTimeout, requests.exceptions.ConnectionError):
            print("Doesn't work")
0 голосов
/ 24 января 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...