国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Python多線程爬蟲為何效率低下?解析原因并提高爬蟲速度的方法

這篇具有很好參考價值的文章主要介紹了Python多線程爬蟲為何效率低下?解析原因并提高爬蟲速度的方法。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、知識點

線程(Thread)也叫輕量級進程,是操作系統(tǒng)能夠進行運算調度的最小單位,它被包含在進程之中,是進程中的實際運作單位。線程自己不擁有系統(tǒng)資源,只擁有一點在運行中必不可少的資源,但它可與同屬的一個進程的其它線程共享進程所擁有的全部資源。一個線程可以創(chuàng)建和撤銷另一個線程,同一進程中的多個線程之間可以并發(fā)執(zhí)行。

二、多線程語法

在Python中實現(xiàn)多線程編程需要用到的就是threading模塊中的Thread類,我們來看看最簡單的語法,我們首先來一個簡單的函數。

def task(num):
    count = 0
    for i in range(num):
        count += 1
    print(count)


nums = [100, 1000, 10000]
for num in nums:
    task(num)

# 100
#1000
#10000

我們用三個子線程分別計算。

import threading


def task(num):
    count = 0
    for i in range(num):
        count += 1
    print(count)


nums = [100, 1000, 10000]
for num in nums:
    t = threading.Thread(target=task, args=(num,))
    t.start()

利用Thread創(chuàng)建線程,target參數接收函數名,args參數接收函數的參數,start方法啟動線程。

這里還需要講解一下join方法,他的作用是讓主線程等待,直到該子線程結束。我們來看看加該方法和不加該方法,最終的結果是怎么樣的。

import threading


def task():
    num = 0
    for i in range(10000000):
        num += 1
    print(num)


t = threading.Thread(target=task)
t.start()
print('end')

# end
# 10000000

import threading


def task():
    num = 0
    for i in range(10000000):
        num += 1
    print(num)


t = threading.Thread(target=task)
t.start()
t.join()
print('end')

# 10000000
# end

GIL

在說概念之前,我們還是以上面的代碼為例,分別求單線程和多線程代碼運行的時間。

單線程
import time


def task(num):
    count = 0
    for i in range(num):
        count += 1
    print(count)


nums = [1000000, 100000000, 1000000000]
start = time.time()
for num in nums:
    task(num)
end = time.time()
print(end - start)

# 50.44705629348755
多線程
import threading
import time


def task(num):
    count = 0
    for i in range(num):
        count += 1
    print(count)


nums = [1000000, 100000000, 1000000000]
ts = []
start = time.time()

for num in nums:
    t = threading.Thread(target=task, args=(num,))
    t.start()
    ts.append(t)

for t in ts:
    t.join()

end = time.time()
print(end - start)

# 55.022353172302246

你會發(fā)現(xiàn)多線程比單線程花費的時間還要更多,這是因為GIL的原因。

GIL的全稱是Global Interpreter Lock(全局解釋器鎖),Python最初的設計理念在于,為了解決多線程之間數據完整性和狀態(tài)同步的問題,設計為在任意時刻只能由一個線程在解釋器中運行。因此Python中的多線程是表面上的多線程(同一時刻只有一個線程),不是真正的多線程。

但是如果是因為GIL的原因,就說多線程無用是不對的,對于IO密集的程序,多線程是要比單線程快的。我們舉一個簡單的爬蟲案例。

單線程
import time


def task(url):
    s = url.split('_')[-1]
    time.sleep(int(s)) #這里模擬請求等待


urls = ['url_1', 'url_2', 'url_3']
start = time.time()
for url in urls:
    task(url)
end = time.time()
print(end - start)

# 6.013520002365112
多線程
import threading
import time


def task(url):
    s = url.split('_')[-1]
    time.sleep(int(s))


ts = []
urls = ['url_1', 'url_2', 'url_3']
start = time.time()

for url in urls:
    t = threading.Thread(target=task, args=(url,))
    t.start()
    ts.append(t)

for t in ts:
    t.join()


end = time.time()
print(end - start)

# 3.005527973175049

這時候我們就能看到多線程的優(yōu)勢了,雖然多線程只是在各線程來回切換,但是可以讓IO堵塞的時間切換到其他線程做其他的任務,很適合爬蟲或者文件的操作。

最后的驚喜

最后這里有準備一些Python的學習資料需要的自取哈文章來源地址http://www.zghlxwxcb.cn/news/detail-427306.html

到了這里,關于Python多線程爬蟲為何效率低下?解析原因并提高爬蟲速度的方法的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 使用多線程或異步技術提高圖片抓取效率

    使用多線程或異步技術提高圖片抓取效率

    圖片抓取是爬蟲技術中常見的需求,但是圖片抓取的效率受到很多因素的影響,比如網速、網站反爬機制、圖片數量和大小等。本文將介紹如何使用多線程或異步技術來提高圖片抓取的效率,以及如何使用爬蟲代理IP來避免被網站封禁。 多線程和異步技術都是利用計算機的并

    2024年02月09日
    瀏覽(16)
  • Java并發(fā)(二)----初次使用多線程并行提高效率

    并行代表充分利用多核 cpu 的優(yōu)勢,提高運行效率。 想象下面的場景,執(zhí)行 3 個計算,最后將計算結果匯總。 如果是串行執(zhí)行,那么總共花費的時間是 10 + 11 + 9 + 1 = 31ms 但如果是四核 cpu,各個核心分別使用線程 1 執(zhí)行計算 1,線程 2 執(zhí)行計算 2,線程 3 執(zhí)行計算 3,那么 3 個

    2023年04月13日
    瀏覽(26)
  • 【PyQt5實現(xiàn)多線程更新UI】- 提高程序效率,優(yōu)化用戶體驗

    【PyQt5實現(xiàn)多線程更新UI】- 提高程序效率,優(yōu)化用戶體驗 在PyQt5應用程序的開發(fā)中,當程序需要處理大量數據或進行復雜的計算時,如果僅使用主線程,會導致GUI界面失去響應,用戶體驗較差。為了解決這個問題,通常需要使用多線程技術。 而在使用多線程時,往往需要更新

    2024年02月07日
    瀏覽(16)
  • 計算機視覺---flask框架封裝目標檢測,應用線程提高程序運行效率

    計算機視覺---flask框架封裝目標檢測,應用線程提高程序運行效率

    1.前言 上一篇文章flask部署 目標檢測算法中講到可以將檢測算法封裝到flask框架中進行web端展示,但在實際應用中發(fā)現(xiàn)一些問題并進行了解決,在本文中進行補充。 2.利用線程,提高flask程序運行效率 flask web端訪問時,每次都會從頭加載程序,導致每次訪問頁面刷新率很低或

    2024年02月16日
    瀏覽(27)
  • 爬蟲入門指南(5): 分布式爬蟲與并發(fā)控制 【提高爬取效率與請求合理性控制的實現(xiàn)方法】

    爬蟲入門指南(5): 分布式爬蟲與并發(fā)控制 【提高爬取效率與請求合理性控制的實現(xiàn)方法】

    在進行爬蟲任務時,我們常常會面臨兩個重要問題:如何提高爬取效率以及如何合理控制請求的并發(fā)量,以避免對目標網站造成過大的壓力。針對這些問題,本文將介紹分布式爬蟲與并發(fā)控制的相關知識點,并演示使用Scrapy框架實現(xiàn)分布式爬蟲,并對并發(fā)控制進行限制請求頻

    2024年02月12日
    瀏覽(25)
  • 提高水泵可靠度與生產效率:故障診斷系統(tǒng)實踐解析

    提高水泵可靠度與生產效率:故障診斷系統(tǒng)實踐解析

    水泵作為工廠生產線中不可或缺的設備之一,其正常運行對于生產效率和設備可靠性至關重要。然而,水泵故障可能會導致設備停機和生產中斷,給企業(yè)帶來巨大損失。 圖.水泵(iStock) 為了解決這一問題,水泵健康管理分析與故障診斷系統(tǒng)應運而生,通過該系統(tǒng)可以提高水

    2024年02月07日
    瀏覽(20)
  • 深入解析MySQL視圖、索引、數據導入導出:優(yōu)化查詢和提高效率

    深入解析MySQL視圖、索引、數據導入導出:優(yōu)化查詢和提高效率

    目錄 1. 視圖(View): 什么是視圖? 為什么要使用視圖? 視圖的優(yōu)缺點 1) 定制用戶數據,聚焦特定的數據 2) 簡化數據操作 3) 提高數據的安全性 4) 共享所需數據 5) 更改數據格式 6) 重用 SQL 語句 示例操作 沒使用前 使用后 2. 索引(Index): 什么是索引? 為什么要使用索引?

    2024年02月13日
    瀏覽(39)
  • Git與IDEA: 解決`dev`分支切換問題及其背后原因 為何在IDEA中無法切換到`dev`分支?全面解析!

    Git與IDEA: 解決`dev`分支切換問題及其背后原因 為何在IDEA中無法切換到`dev`分支?全面解析!

    ???? 博主貓頭虎(????)帶您 Go to New World??? ?? 博客首頁 ——????貓頭虎的博客?? ?? 《面試題大全專欄》 ?? 文章圖文并茂??生動形象??簡單易學!歡迎大家來踩踩~?? ?? 《IDEA開發(fā)秘籍專欄》 ?? 學會IDEA常用操作,工作效率翻倍~?? ?? 《100天精通Golang(基礎

    2024年02月09日
    瀏覽(31)
  • 爬蟲使用代理IP不會被限的原因解析

    在網絡爬蟲的世界中,使用代理IP可以為您帶來許多好處,其中之一就是能夠避免被目標網站限制或封鎖。本文將解析爬蟲使用代理IP不會被限的原因,幫助您突破封鎖,高效抓取所需數據! IP匿名性: 代理IP可以隱藏爬蟲程序的真實IP地址,使目標網站無法準確獲取您的真實

    2024年02月07日
    瀏覽(14)
  • 提高代碼效率的6個Python內存優(yōu)化技巧

    提高代碼效率的6個Python內存優(yōu)化技巧

    當項目變得越來越大時,有效地管理計算資源是一個不可避免的需求。Python與C或c++等低級語言相比,似乎不夠節(jié)省內存。 但是其實有許多方法可以顯著優(yōu)化Python程序的內存使用,這些方法可能在實際應用中并沒有人注意,所以本文將重點介紹Python的內置機制,掌握它們將大

    2024年01月18日
    瀏覽(31)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包