python多線程之從Thread類繼承
上一篇文章實現多線程的方式是
- 創建函數
- 用
Thread
函數創建進程,將要運行的函數傳入其中
本文我們講另一種實現多線程的方式————從threading.Thread類繼承出一個新類,主要實現__init__
和run
方法
一
首先我們來看一個最簡單的例子,只實現了run
方法
import timeimport threadingclass MyThread(threading.Thread): def run(self): time.sleep(1) a = 1 + 1 print(a)for _ in range(5): th = MyThread() th.start()
解讀如下
- 定義一個類,繼承
threading.Thread
類,裡面只需要定義run
方法 run
方法相當於之前傳入Thread
的那個函數,注意只能用run
這個名字,不用顯式調用,線程start()
時會自動調用run
- 創建類的實例時不需要傳入參數,得到的結果就可以調用
start join
等方法 - 上一篇文章提過
Thread
對象可以調用start join run
等方法,其實當時調用start
就是自動調用了run
。這裡只不過是在新類中重寫了run
方法,線程調用start
時就會自動執行這個run
二
上面每次運行的run
都是一樣的,真正使用時很少會這樣用,有時會需要傳入一些區別性的參數,這就需要定義類的__init__
了,我們來看下面的例子
import threadingimport requestsfrom bs4 import BeautifulSoupclass MyThread(threading.Thread): def __init__(self, i): threading.Thread.__init__(self) self.i = i def run(self): url = https://movie.douban.com/top250?start={}&filter=.format(self.i*25) r = requests.get(url) soup = BeautifulSoup(r.content, html.parser) lis = soup.find(ol, class_=grid_view).find_all(li) for li in lis: title = li.find(span, class_="title").text print(title)for i in range(10): th = MyThread(i) th.start()
上面代碼實現10個線程抓取豆瓣top250網站10頁的電影名,通過__init__
將循環信息傳到類之中。
三
上一篇文章不使用類來使用多線程時,講了Thread
函數的參數,Thread
對象的方法和一些可以直接調用的變數,這裡我們分別講一下
Thread
函數的參數。初始化線程時傳入一些參數,這裡也可以在__init__
中定義Thread
對象的方法。這裡可以用self
直接調用這些方法threading.activeCount()
等直接調用的變數。在這裡依然可以調用
所以用類的方法不會有任何限制,下面來看一個例子
import timeimport threadingclass MyThread(threading.Thread): def __init__(self, name): threading.Thread.__init__(self) self.name = name # 這樣就相當於Thread中的name參數了 def run(self): a = 1 + 1 print(threading.currentThread().name) time.sleep(1) print(self.name) time.sleep(1) print(self.is_alive()) # 未顯式定義過就可以直接用 t = time.time()ths = [MyThread(thread {}.format(i)) for i in range(3)]for th in ths: th.start()print(threading.activeCount())for th in ths: th.join() print(time.time() - t)
返回結果如下
thread 0thread 1thread 24thread 0thread 2thread 1TrueTrueTrue2.0039498805999756
四
使用類繼承方式其實還有另一種形式。
之前是直接用run
定義計算函數,如果已經有一個計算函數,也可以用傳入的方式而不是改寫成run
import threadingimport requestsfrom bs4 import BeautifulSoupdef gettitle(page): url = https://movie.douban.com/top250?start={}&filter=.format(page*25) r = requests.get(url) soup = BeautifulSoup(r.content, html.parser) lis = soup.find(ol, class_=grid_view).find_all(li) for li in lis: title = li.find(span, class_="title").text print(title)class MyThread(threading.Thread): def __init__(self, target, **args): threading.Thread.__init__(self) self.target = target self.args = args def run(self): self.target(**self.args)for i in range(10): th = MyThread(gettitle, page = i) th.start()
專欄信息
專欄主頁:python編程
專欄目錄:目錄
版本說明:軟體及包版本說明
推薦閱讀: