运行 时间大约为 12 秒,有和没有多处理。在此示例中,多处理不应该更快吗?

Run time is roughly 12 seconds, with and without multiprocessing. Shouldnt multiprocessing be faster in this example?

我有这个网络抓取工具,可以抓取 4 种不同金属的价格。 提到的 运行 时间大约为 12 秒多处理或不多处理。这段代码不应该运行 大致同时运行4次,并且刚好占运行 时间的75%吗? 我的处理器是4核4线程的,如果跟这个有关系的话。

def scraper(url,metal):
    global aluPriser
    global zinkPriser
    global messingPriser
    global kobberPriser
    global tal
    url.status_code
    url.headers
    c = url.content
    soup = BeautifulSoup(c, "html.parser")
    samples = soup.find_all("td",style="text-align:center;white-space:nowrap;border-left:solid black 1px")
    for a in samples:
        for b in a:
            if b.startswith("$"):
                b = b.replace(" ","")
                b = b.replace("$","")
                b = int(b)
                tal.append(b)

我运行此代码具有以下多处理代码:

if __name__ == '__main__':
    url = "https://www.alumeco.dk/viden-og-teknik/metalpriser/aluminiumpriser?s=0"
    url = requests.get(url)
    whatDate(url)
    p1 = Process(target=scraper(url,"alu"))
    p1.start()


    url = "https://www.alumeco.dk/viden-og-teknik/metalpriser/kobber?s=0"
    url = requests.get(url)
    p2 = Process(target=scraper(url,"kobber"))
    p2.start()


    url = "https://www.alumeco.dk/viden-og-teknik/metalpriser/metal-priser-mp58?s=0"
    url = requests.get(url)
    p3 = Process(target=scraper(url,"messing"))
    p3.start()


    url = "https://www.alumeco.dk/viden-og-teknik/metalpriser/zink?s=0"
    url = requests.get(url)
    p4 = Process(target=scraper(url,"zink"))

    p4.start()
    p1.join()
    p2.join()
    p3.join()
    p4.join()

要从此处的并行化中获得真正的好处,您需要将 requests.get() 移动到 scraper 函数中。你几乎所有的时间都花在做网络请求上;如果几乎不花时间,并行化 CPU-bound 位并不重要。

也就是说,multiprocessing也是这个特定工作的错误工具:你付出的 serialization/deserialization 成本比没有 GIL 获得的收益还多争论。请改用 threading