最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python3多線程爬蟲實例講解代碼

 更新時間:2018年01月05日 14:17:54   作者:pythontab  
本篇文章主要介紹了Python3多線程爬蟲實例講解代碼,Python3使用threading模塊來進行多線程,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

多線程概述

多線程使得程序內(nèi)部可以分出多個線程來做多件事情,充分利用CPU空閑時間,提升處理效率。python提供了兩個模塊來實現(xiàn)多線程thread 和threading ,thread 有一些缺點,在threading 得到了彌補。并且在Python3中廢棄了thread模塊,保留了更強大的threading模塊。

使用場景

在python的原始解釋器CPython中存在著GIL(Global Interpreter Lock,全局解釋器鎖),因此在解釋執(zhí)行python代碼時,會產(chǎn)生互斥鎖來限制線程對共享資源的訪問,直到解釋器遇到I/O操作或者操作次數(shù)達到一定數(shù)目時才會釋放GIL。所以,雖然CPython的線程庫直接封裝了系統(tǒng)的原生線程,但CPython整體作為一個進程,同一時間只會有一個獲得GIL的線程在跑,其他線程則處于等待狀態(tài)。這就造成了即使在多核CPU中,多線程也只是做著分時切換而已。

如果你的程序是CPU密集型,多個線程的代碼很有可能是線性執(zhí)行的。所以這種情況下多線程是雞肋,效率可能還不如單線程因為有上下文切換開銷。但是如果你的代碼是IO密集型,涉及到網(wǎng)絡、磁盤IO的任務都是IO密集型任務,多線程可以明顯提高效率,例如多線程爬蟲,多線程文件處理等等

多線程爬蟲

多線程爬蟲的代碼實例

注: 以下代碼在python3下運行通過, python2版本差異較大,不能運行成功,如需幫助請下方留意。

# coding=utf-8
import threading, queue, time, urllib
from urllib import request
baseUrl = 'http://www.pythontab.com/html/pythonjichu/'
urlQueue = queue.Queue()
for i in range(2, 10):
 url = baseUrl + str(i) + '.html'
 urlQueue.put(url)
 #print(url)
def fetchUrl(urlQueue):
 while True:
  try:
   #不阻塞的讀取隊列數(shù)據(jù)
   url = urlQueue.get_nowait()
   i = urlQueue.qsize()
  except Exception as e:
   break
  print ('Current Thread Name %s, Url: %s ' % (threading.currentThread().name, url))
  try:
   response = urllib.request.urlopen(url)
   responseCode = response.getcode()
  except Exception as e:
   continue
  if responseCode == 200:
   #抓取內(nèi)容的數(shù)據(jù)處理可以放到這里
   #為了突出效果, 設置延時
   time.sleep(1)
if __name__ == '__main__':
 startTime = time.time()
 threads = []
 # 可以調(diào)節(jié)線程數(shù), 進而控制抓取速度
 threadNum = 4
 for i in range(0, threadNum):
  t = threading.Thread(target=fetchUrl, args=(urlQueue,))
  threads.append(t)
 for t in threads:
  t.start()
 for t in threads:
  #多線程多join的情況下,依次執(zhí)行各線程的join方法, 這樣可以確保主線程最后退出, 且各個線程間沒有阻塞
  t.join()
 endTime = time.time()
 print ('Done, Time cost: %s ' % (endTime - startTime))

運行結(jié)果:

1個線程時:

Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/2.html 
Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/3.html 
Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/4.html 
Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/5.html 
Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/6.html 
Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/7.html 
Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/8.html 
Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/9.html 
Done, Time cost: 8.182249069213867

2個線程時:

Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/2.html 
Current Thread Name Thread-2, Url: http://www.pythontab.com/html/pythonjichu/3.html 
Current Thread Name Thread-2, Url: http://www.pythontab.com/html/pythonjichu/4.html 
Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/5.html 
Current Thread Name Thread-2, Url: http://www.pythontab.com/html/pythonjichu/6.html 
Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/7.html 
Current Thread Name Thread-2, Url: http://www.pythontab.com/html/pythonjichu/8.html 
Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/9.html 
Done, Time cost: 4.0987958908081055

3個線程時:

Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/2.html 
Current Thread Name Thread-2, Url: http://www.pythontab.com/html/pythonjichu/3.html 
Current Thread Name Thread-3, Url: http://www.pythontab.com/html/pythonjichu/4.html 
Current Thread Name Thread-4, Url: http://www.pythontab.com/html/pythonjichu/5.html 
Current Thread Name Thread-2, Url: http://www.pythontab.com/html/pythonjichu/6.html 
Current Thread Name Thread-4, Url: http://www.pythontab.com/html/pythonjichu/7.html 
Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/9.html 
Current Thread Name Thread-3, Url: http://www.pythontab.com/html/pythonjichu/8.html 
Done, Time cost: 2.287320137023926

通過調(diào)節(jié)線程數(shù)可以看到,執(zhí)行時間會隨著線程數(shù)的增加而縮短,抓取效率成正比增加。

總結(jié):

Python多線程在IO密集型任務,多線程可以明顯提高效率,CPU密集型任務不適合使用多線程處理。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 一文詳解PyQt5中信號(Signal)與槽(Slot)

    一文詳解PyQt5中信號(Signal)與槽(Slot)

    信號(Signal)與槽(Slot)是Qt中的核心機制,也是在PyQt編程中對象之間進行通信的機制。這篇文章主要帶大家了解一下信號(Signal)與槽(Slot)的使用,需要的可以參考一下
    2022-12-12
  • Flask利用自定義接口實現(xiàn)mock應用詳解

    Flask利用自定義接口實現(xiàn)mock應用詳解

    后端接口已提供,前端需要依賴后端接口返回的數(shù)據(jù)進行前端頁面的開發(fā),如何配合前端?這篇就來介紹一下Flask如何利用自定義接口實現(xiàn)mock應用,需要的可以參考一下
    2023-03-03
  • Pandas之缺失數(shù)據(jù)的實現(xiàn)

    Pandas之缺失數(shù)據(jù)的實現(xiàn)

    這篇文章主要介紹了Pandas之缺失數(shù)據(jù)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • Python GUI編程完整示例

    Python GUI編程完整示例

    這篇文章主要介紹了Python GUI編程,結(jié)合完整示例形式分析了Python基于tkinter模塊的GUI圖形界面編程相關實現(xiàn)技巧,需要的朋友可以參考下
    2019-04-04
  • 深入了解Python enumerate和zip

    深入了解Python enumerate和zip

    這篇文章主要介紹了Python enumerate和zip的相關資料,文中講解非常細致,幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07
  • Python調(diào)用PC攝像頭實現(xiàn)掃描二維碼

    Python調(diào)用PC攝像頭實現(xiàn)掃描二維碼

    PC攝像機掃描二維碼的應用場景很廣泛,可以應用于各種需要快速掃描、識別和管理的場景,本文就來具體講講如何用Python實現(xiàn)這一功能吧
    2023-05-05
  • PyCharm出現(xiàn)Error:Python?packaging?tool?'setuptools'?not?found解決辦法

    PyCharm出現(xiàn)Error:Python?packaging?tool?'setuptools&apo

    這篇文章主要給大家介紹了關于PyCharm出現(xiàn)Error:Python?packaging?tool?'setuptools'?not?found的解決辦法,文中通過圖文及代碼介紹的非常詳細,需要的朋友可以參考下
    2023-12-12
  • python輸入多行字符串的方法總結(jié)

    python輸入多行字符串的方法總結(jié)

    在本篇文章里小編給大家分享的是關于python輸入多行字符串的方法以及實例代碼,需要的朋友們可以學習下。
    2019-07-07
  • 使用Python批量生成PPT版榮譽證書的示例代碼

    使用Python批量生成PPT版榮譽證書的示例代碼

    使用Python處理PPT文件通常需要使用第三方庫來簡化對PPT文件的讀取、寫入和修改操作,本文將給大家介紹一個小案例,使用Python批量生成PPT版榮譽證書,感興趣的同學跟著小編一起來看看吧
    2023-08-08
  • 三個Python自動化辦公好用到爆的模塊分享

    三個Python自動化辦公好用到爆的模塊分享

    本文小編來給大家推薦幾個在自動化辦公領域當中非常好用的Python模塊,可以幫助大家在工作當中及大地提高效率,避免重復機械化地操作流程
    2022-07-07

最新評論

剑川县| 抚宁县| 雷州市| 合肥市| 洛扎县| 庆云县| 长沙县| 娄烦县| 东至县| 文昌市| 裕民县| 隆化县| 宁波市| 邓州市| 广州市| 凭祥市| 伊宁市| 康马县| 汕头市| 奉新县| 寿宁县| 罗定市| 綦江县| 巴南区| 普宁市| 宁陵县| 奉新县| 卢龙县| 四会市| 连城县| 梨树县| 尖扎县| 垦利县| 甘德县| 东莞市| 南通市| 横山县| 古蔺县| 同江市| 屯昌县| 印江|