Python使用多執行緒(附 爬蟲使用的執行緒池)

2021-09-05 12:39:19 字數 2886 閱讀 4628

使用的庫:

python 3.+ :threading(較高階,常用),   _thread(python2.+中叫 thread)(偏底層)

python 2.+ :thread

實現多執行緒:(python3.6,使用threading庫)

1:函式實現

#第一種:通過函式建立執行緒

def 函式a():

pass

# 獲得乙個執行緒物件。

t = threading.thread(target=函式a的名字,name=自己隨便取的執行緒名字,args=(引數1,...))  

# 啟動執行緒 

t.start();

2:繼承執行緒類(類實現)

class fetcher(threading.thread):

def __init__(self):

thread.__init__(self):

#加這一步的目的是保證,主線程退出後子執行緒也會跟著中斷退出

self.daemon = true

# 必須要寫

def run(self):

#執行緒執行的函式

pass

# 獲得物件,並啟動執行緒

t = fetcher()

t.start()

執行緒同時操作乙個全域性變數時會產生執行緒競爭所以,需要鎖來避免競爭。

實現鎖:

lock = threading.lock()

lock.acquire()      #獲得鎖,加鎖

#..操作全域性變數..(寫檔案,寫入資料庫等)

lock.release()      #釋放鎖

多執行緒同步就是多個執行緒競爭乙個全域性變數時按順序讀寫,一般情況下要用鎖,但是使用標準庫里的queue的時候它內部已經實現了鎖,不用程式設計師自己寫了。

# 匯入佇列類:

from queue import queue

# 建立乙個佇列:

q = queue(maxsize=0) # maxsize為佇列大小,為0預設佇列大小可無窮大。

# 佇列是先進先出的資料結構:

q.put(item) #往佇列新增乙個item,佇列滿了則阻塞

q.get(item) #從佇列得到乙個item,隊列為空則阻塞

還有相應的不等待的版本,這裡略過。

佇列不為空,或者為空但是取得item的執行緒沒有告知任務完成時都是處於阻塞狀態

q.join()    #阻塞直到所有任務完成

# 執行緒告知任務當前任務已結束,可以開始下次任務使用 task_done() 函式

******************************實現簡單執行緒池(爬蟲使用)******************************====

1:建立乙個執行緒類:

class testthread(threading.thread):

def __init__(self,task,lock):

threading.thread.__init__(self);

self.task = task ;  # 乙個佇列,用來存放要爬取的url

self.lock = lock ; # 乙個鎖物件,用來保護存入資料庫等的操作

self.daemon = true; # 當主線程退出時,子執行緒也退出。

self.start(); # 執行當前執行緒。

# 執行緒中的主執行方法

def run(self):

while true:

# 從佇列中獲取url,若沒有則一直阻塞,直到獲取到乙個url。

url = self.task.get(); 

"""這裡進行爬資料的操作

"""# 向任務稟報當前任務執行結束,可以開始下一任務

self.task.task_done();

2:建立乙個執行緒池類

class threadpool():

def __init__(self,thread_num,lock):

self.task = queue.queue(); # 生成乙個佇列,用來儲存要爬取的連線

self.lock = lock; # 乙個鎖物件,用來保護寫入檔案

# 根據傳入的執行緒數目,建立對應個執行緒

for i in range(thread_num):

testthread(self.task,lock);

def add_task(self,url):

# 往佇列中放url,直到佇列滿則阻塞。

self.task.put(url)

def wait_complite(self):

# 阻塞佇列中的所有執行緒,直到主線程執行完畢

self.task.join();

3:使用

if __name__ == "__main__":

print("開始於:",start)

lock = threading.lock();

pool = threadpool(2,lock);

for i in range(21):

pool.add_task(i)

pool.wait_complite();

print("主線程結束");

print("共用時:",time.time()-start)

python多執行緒爬蟲使用

1.getip方法 從 獲取免費 ip並儲存在csv文件中。2.getproxy方法 從文件中取出ip和埠,組裝ip,並儲存在集合中。4.主方法 分別用普通方法測試完成時間singleprocess needs 和使用多執行緒測試完成時間multiprocess needs 由於本電腦核心數為4,使...

python爬蟲 多執行緒爬蟲

在進行爬蟲工作的時候,考慮到爬蟲執行的速度慢,那麼怎樣提公升爬蟲的速度呢,那麼就得使用多執行緒爬蟲了,接下來我以糗事百科段子的爬取進行對多執行緒爬蟲的概述 github鏈結 鏈結一 不使用多執行緒爬取糗事百科 1.上 import urllib.request import re headers f...

python多執行緒爬蟲

先記錄一下,普通的糗事百科爬蟲 import urllib.request import re import time import urllib.error headers user agent mozilla 5.0 windows nt 10.0 win64 x64 rv 63.0 gecko...