Python 线程仍然需要很长时间

Python 线程仍然需要很长时间,python,multithreading,shopify,python-multithreading,Python,Multithreading,Shopify,Python Multithreading,我已经做了一个脚本,它为shopify网站构建了一个结帐URL。这是通过在结帐URL中附加每个独特的产品“变体”ID,然后在webbrowser中打开所述URL来实现的。为了找到变体ID,我需要解析网站的站点地图以获取ID,目前我正在为我解析的每个产品分别执行不同的线程,但是随着每个线程的增加,所需的时间会增加很多(近1秒) 为什么会这样?既然每个线程基本上做相同的事情,那么它不应该花费相同的时间吗 作为参考,一个线程大约需要2.0秒,两个线程需要2.8秒,三个线程大约需要3.8秒 这是我的密码

我已经做了一个脚本,它为shopify网站构建了一个结帐URL。这是通过在结帐URL中附加每个独特的产品“变体”ID,然后在webbrowser中打开所述URL来实现的。为了找到变体ID,我需要解析网站的站点地图以获取ID,目前我正在为我解析的每个产品分别执行不同的线程,但是随着每个线程的增加,所需的时间会增加很多(近1秒)

为什么会这样?既然每个线程基本上做相同的事情,那么它不应该花费相同的时间吗

作为参考,一个线程大约需要2.0秒,两个线程需要2.8秒,三个线程大约需要3.8秒

这是我的密码:

import time
import requests
from bs4 import BeautifulSoup
import webbrowser
import threading

sitemap2 = 'https://deadstock.ca/sitemap_products_1.xml'
atc_url = 'https://deadstock.ca/cart/'

# CHANGE SITEMAP TO THE CORRECT ONE (THE SITE YOU ARE SCRAPING)

variant_list = []


def add_to_cart(keywords, size):
    init = time.time()
    # Initialize session
    product_url = ''
    parse_session = requests.Session()
    response = parse_session.get(sitemap2)
    soup = BeautifulSoup(response.content, 'lxml')
    variant_id = 0

    # Find Item
    for urls in soup.find_all('url'):
        for images in urls.find_all('image:image'):
            if all(i in images.find('image:title').text.lower() for i in keywords):
                now = time.time()
                product_name = images.find('image:title').text
                print('FOUND: ' + product_name + ' - ' + str(format(now-init, '.3g')) + 's')
                product_url = urls.find("loc").text

    if product_url != '':
        response1 = parse_session.get(product_url+".xml")
        soup = BeautifulSoup(response1.content,'lxml')
        for variants in soup.find_all('variant'):
            if size in variants.find('title').text.lower():
                variant_id = variants.find('id', type='integer').text
                atc_link = str(variant_id)+':1'
                print(atc_link)
                variant_list.append(atc_link)


    try:
        print("PARSED PRODUCT: " + product_name)

    except UnboundLocalError:
        print("Retrying")
        add_to_cart(keywords, size)


def open_checkout():
    url = 'https://deadstock.ca/cart/'
    for var in variant_list:
        url = url + var + ','
    webbrowser.open_new_tab(url)




# When initializing a new thread, only change the keywords in the args, and make sure you start and join the thread.
# Change sitemap in scraper.py to your websites' sitemap

# If the script finds multiple items, the first item will be opened so please try to be very specific yet accurate.

def main():
    print("Starting Script")
    init = time.time()

    try:
        t1 = threading.Thread(target=add_to_cart, args=(['alltimers','relations','t-shirt','white'],'s',))
        t2 = threading.Thread(target=add_to_cart, args=(['alltimers', 'relations', 'maroon'],'s',))
        t3 = threading.Thread(target=add_to_cart, args=(['brain', 'dead','melter'], 's',))
        t1.start()
        t2.start()
        t3.start()
        t1.join()
        t2.join()
        t3.join()
        print(variant_list)
        open_checkout()
    except:
        print("Product not found / not yet live. Retrying..")
        main()

    print("Time taken: " + str(time.time()-init))

if __name__ == '__main__':
    main()
问题:。。。一个线程大约需要2.0秒,两个线程大约需要2.8秒,三个线程大约需要3.8秒

关于示例代码,您正在计算​ 所有
线程的总和
正如asettouf所指出的,有一个管理费用,这意味着你必须为此付费。
但是我假设,一个接一个地执行这3个任务
线程化
会更快

问题:。。。一个线程大约需要2.0秒,两个线程大约需要2.8秒,三个线程大约需要3.8秒

关于示例代码,您正在计算​ 所有
线程的总和
正如asettouf所指出的,有一个管理费用,这意味着你必须为此付费。

但是我认为,一个接一个地执行这3个任务
线程化
会更快。

正确缩进代码以进行测试readers@donkopotamus抱歉-fixedFirst关于多线程,在使用多个线程(创建时间、上下文切换)时,总是会有开销,这不会使它与线性情况下的时间完全相同。其次,请注意,在您的代码中,您计算的时间还包括
open\u checkout
调用,这很难被视为常数(除非您的带宽始终是常数)。最后,由于GIL的存在,Python的实现大大降低了多线程实现的速度,这与另一种语言相比(请参阅)可以适当地缩进代码以实现readers@donkopotamus抱歉-fixedFirst关于多线程,在使用多个线程(创建时间、上下文切换)时,总是会有开销,这不会使它与线性情况下的时间完全相同。其次,请注意,在您的代码中,您计算的时间还包括
open\u checkout
调用,这很难被视为常数(除非您的带宽始终是常数)。最后,由于GIL的存在,Python的实现大大降低了多线程实现的速度(参见)