【问题标题】:What should I use to speed up this code? (Multiprocessing vs Multithreading)我应该用什么来加速这段代码? (多处理与多线程)
【发布时间】:2019-01-23 22:55:37
【问题描述】:

你能告诉我怎么做吗? 提前致谢。

代码如下:

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

多处理或多线程应该只在函数被调用时启动。

【问题讨论】:

  • 在您计划多线程/处理的地方使用打印语句时我会小心。输出的顺序可能与您预期的不同。 IE。线程 3 在线程 1 之前打印
  • 那只是为了测试目的,我知道。还是谢谢!

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


【解决方案1】:

我认为线程是最好的,您似乎没有对每个工作人员执行大量计算工作。子流程需要相当多的开销才能启动,因此更适合需要大量计算的任务。

【讨论】:

    【解决方案2】:

    两个观察结果:

    1. 您可以尝试使用 concurrent.futures 库中的 ThreadPoolExecutor 或 ProcessPoolExecutor,这样您就可以并行执行。

    2. 您可能想看看创建显式请求会话并重用会话是否可以加快速度。这可以节省 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")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-18
      • 1970-01-01
      • 1970-01-01
      • 2020-05-24
      • 1970-01-01
      • 2017-09-24
      • 1970-01-01
      • 2017-11-18
      相关资源
      最近更新 更多