代码之家  ›  专栏  ›  技术社区  ›  Luke Hamilton

如果CPU和RAM耗尽,多处理和多线程的结合在python中有用吗?

  •  0
  • Luke Hamilton  · 技术社区  · 4 年前

    我已经了解了多处理和多线程如何加速程序:

    • 多处理,用于CPU限制的任务
    • 多线程用于网络绑定的任务

    如果我执行的任务既受CPU限制又受网络限制,该怎么办?

    我的项目是一个selenium webscraper,它会循环浏览一系列关键字,在Amazon上搜索。搜索每个关键字后,我会提取第一页上所有产品的内容(标题、价格、评论、装运方式等),并将这些内容输出到excel文档中。

    我在这个项目中遇到了一些主要障碍:

    • 有3500+关键字,我需要刮每天,我可以循环约一个关键字,每12秒只使用 一个线程和一个进程 .这需要加快速度,但在运行程序(i5和16GB)时,我似乎已经耗尽了CPU和RAM。既然我已经用完了我的使用量,添加线程或进程会有助于提高效率吗?
    • CPU端的一个主要时间组件是解析每个产品内容,然后将它们放在excel文档的正确列中。从本质上说,亚马逊不容易抓取他们的网站,这意味着很难在HTML中区分模式以便于抓取。我没有从每个产品中提取多个小元素(标题、价格、评论等),而是求助于 one big pull 我捕获了所有产品内容,然后构建了一个算法,可以解析所有信息,并将其上传到excel文档的正确位置。

    大部分运行时间似乎都花在通过算法解析信息和上传到excel文档上。 请记住,我的CPU和RAM使用率已经达到了极限,多线程和多处理能提高效率吗?

    注意:我可以提供一个代码示例,但为了简单起见,我省略了它。我意识到简单的答案可能是:“上传到服务器”,但我想用它作为最后手段。

    0 回复  |  直到 4 年前
        1
  •  0
  •   undetected Selenium    4 年前

    WebDriver is not thread-safe 。尽管如此,您仍然可以序列化对底层 WebDriver 例如,您可以在多个线程中共享引用。但这是不可取的。但是你可以为每个线程实例化一个WebDriver实例。

    理想的情况是 线程安全 不是在代码中,而是在实际的浏览器绑定中。他们都假设一次只有一个命令,就像模拟真实用户一样。但另一方面,你总是可以实例化一个 网络驱动程序 将启动多个浏览选项卡/窗口的每个线程的实例。到目前为止,你的想法似乎还很完美。

    现在,不同了 线程 可以在同一台机器上运行 网络驱动程序 ,但测试结果并不是你所期望的。背后的原因是 要在不同的选项卡/窗口上运行不同的测试,需要一点线程安全编码,否则您将执行以下操作: click() send_keys() 将转到当前具有 focus 不管 线 你期待着跑步。这基本上意味着所有的测试都将在相同的选项卡/窗口上同时运行 集中 但是 在所需的选项卡/窗口上。

    然而,一个可行的解决方案可能是使用 remote.webdriver 这是一个 抽象基类 适用于所有Webdriver子类型。 抽象基类 将允许注册Webdriver的自定义实现,以便isinstance类型检查将成功。