我应该使用什么来加速此代码? (多处理与多线程)

时间:2019-01-23 22:55:37

标签: python loops python-requests python-multiprocessing python-multithreading

您还可以告诉我如何吗? 预先感谢。

代码如下:

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 :(得分:0)

我认为线程化是最好的,似乎您并没有在每个工作者上执行大量的计算工作。子流程需要相当大的开销才能开始,因此更适合需要大量计算的任务。

答案 1 :(得分:0)

两个观察结果:

  1. 您可以尝试使用并发库中的ThreadPoolExecutor或ProcessPoolExecutor,以便可以并行执行。

  2. 您可能想看看是否创建显式请求Session并重新使用Session可以加快速度。这样可以节省TLS重新协商/握手的成本。请注意,您可能需要谨慎使用cookie,因为默认情况下,重用的会话将共享一个cookie jar。

未经测试,很快就被抓在一起的例子:

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")