05 Python 爬蟲教學10 所有文章

【爬蟲教學】Python多線池MultiThreadPool的兩種方法

multithreadpool

先來看一下實施線程池後,可以將每一個頁面原本需要15s才能爬取完畢的頁面,降至3.9秒(10 thread pool)~2.28秒(25 thread pool),但是線程池要小心使用,不小心就會像上面圖片一樣,想像中大家是各自完成任務,但實際上是亂七八糟的執行任務

threadpool_times
threadpool_times

多線池(Multithread Pool)實現方法一

首先install threadpool,這是個最後更新時間在2015年的套件目前已經沒有人維護了,但使用起來相當簡單和方便,目前python3.7版本使用上沒有問題。

pip install threadpool
多線池程式如下,將要執行的主程式放在main的位置,而list_of_args則是給threadpool要放入的參數,如果是單一參數以list = [‘A’,’B’,’C’]帶入即可
import threading

# 定義線程數量
pool = ThreadPool(3)   

# 調用makeRequests創建要開啟的多線程函數,main為線程主要執行程式,list_of_args為要給main執行的參數
requests = makeRequests(main, list_of_args) 

# 將所有要運行的多線程請求丟進線程池
[pool.putRequest(req) for req in requests]  

# 等待所有線程完成後退出
pool.wait()
如果list_of_args要放入多參數的話,須以下列格式放入:
list_of_args = [(["www.yahoo.com.tw", "27.105.45.13"], None), (["www.google.com.tw", "33.125.45.13"], None)]
我最終的寫法是這樣,一個是url的參數,一個是ip的參數
import Queue 

q= Queue()

for i inrange(len(df)):
    q.put(df['頁面'][i])

lst = [([q.get(),ip_list[random.randrange(0,len(ip_list))]],None) for i in range(q.qsize())]

多線池(Multithread Pool)實現方法二

但我個人比較推薦的是multiprocessing.dummy,因為他跟進程池只差在dummy的不同,所以在切換上還蠻方便的!

multiprocessing.dummy多線池

from multiprocessing.dummy import Pool as ThreadPool

def f(x):
    return x*x

if __name__ == '__main__':
    p =ThreadPool(5)
    p.map(f, [1, 2, 3])

multiprocessing進程池

from multiprocessing import Pool

def f(x):
    return x*x

if __name__ == '__main__':

    p = Pool(5)
    p.map(f, [1, 2, 3])

那 【爬蟲筆記】Python實現多線池Multi thread Pool的兩種方法 就到這邊感謝收看,如文章內容有誤請不吝指正!

關於爬蟲相關的延伸閱讀:

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *