Ускорение использования многопоточности python3 - PullRequest
1 голос
/ 27 мая 2020

На самом деле я создаю средство проверки прокси, но проблема в том, что на проверку уходит много времени, потому что прокси много

def proxy():
    lives = []
    allproxy = []

    def fetch_proxy():
        raw_proxy = []
        res = requests.get(proxy_api)
        raw_proxy = res.text.splitlines()
        return raw_proxy

    allproxy = fetch_proxy()

    for proxy in allproxy:
        try:

            proxyDictChk = { 
                          "https"  : "https://"+proxy, 
                          "http" : "http://"+proxy,
                        }
            res = requests.get("http://httpbin.org/ip",proxies=proxyDictChk,timeout=3)
            print("Proxy is Working")
            lives.append(proxy)
        except Exception as e:
            print("Proxy Dead")
    return lives

print(proxy())

Мне любопытно, как я могу здесь использовать многопоточность чтобы сделать это быстро

PS. Заранее спасибо

1 Ответ

0 голосов
/ 27 мая 2020

Документы python предоставляют довольно хороший пример: https://docs.python.org/3/library/concurrent.futures.html

# We can use a with statement to ensure threads are cleaned up promptly
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
    # Start the load operations and mark each future with its URL
    future_to_url = {executor.submit(check_proxy, url, 60): url for url in allproxy}
    for future in concurrent.futures.as_completed(future_to_url):
        url = future_to_url[future]
        try:
            is_valid = future.result()
        except Exception as exc:
            print('%r generated an exception: %s' % (url, exc))
        else:
            print('%s page is %s' % (url, is_valid))

Таким образом, вам просто нужно определить функцию check_proxy.

def check_proxy( proxy ):
    try:
        proxyDictChk = { 
                      "https"  : "https://"+proxy, 
                      "http" : "http://"+proxy,
                    }
        res = requests.get("http://httpbin.org/ip",proxies=proxyDictChk,timeout=3)
        print("Proxy is Working")
        return True
    except Exception as e:
        print("Proxies Dead!")
        return False

По сути, используйте исполнителя и отправьте функцию, которая делает то, что вы хотите. Затем используйте future, чтобы получить результаты функций по мере их выполнения.

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

def check_proxy( proxy ):
    proxyDictChk = { "https"  : "https://"+proxy, 
                      "http" : "http://"+proxy,
                    }
    res = requests.get("http://httpbin.org/ip",proxies=proxyDictChk,timeout=3)
    return True

Теперь исключение может быть обработано в будущем состоянии. Вы можете изменить тип возвращаемого значения на что-нибудь более значимое.

...