线程仍然需要很长时间
问题描述:
我已经为shopify网站构建了一个结帐URL。这是通过在结帐URL中追加每个唯一产品的“变体”ID然后在网页浏览器中打开该URL来完成的。要找到变体ID,我需要解析网站的网站地图以获取ID,我正在为每个我正在解析的产品分别执行不同的线程,但是每个线程都增加了相当多的时间(几乎一个第二)。线程仍然需要很长时间
为什么会出现这种情况?难道它不应该在几乎相同的时间,因为每个线程基本上做同样的事情?
作为参考,一个线程需要大约2.0秒,两个线程2.8s和周围3.8S
以下三个线程是我的代码:
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.0s,两个线程2.8s和三个线程3.8s左右
关于您的示例代码,您正在计数所有threads
的总和。
由于#asettouf指出,有一个开销,意味着你必须付出代价。
但我想,做这3个任务threaded
将会更快,因为它一个接一个地做。
为您的代码正确缩进代码 – donkopotamus
@donkopotamus apologies - fixed – JC1
首先关于多线程,当使用多个线程(创建时间,上下文切换)时,您将总是会得到一个开销,这将不会像完成同一时间线性情况。其次,注意在你的代码中,你计算的时间还包括'open_checkout'调用,它几乎不能被认为是一个常量(除非你的带宽总是**不变)。最后,由于GIL,Python的实现与另一种语言相比,大大减缓了多线程实现的速度(请参阅https://docs.python.org/2/glossary.html#term-global-interpreterlock) – Adonis