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編程

專欄目錄:目錄

版本說明:軟體及包版本說明

推薦閱讀:

現在學編程,晚么?
C語言基礎:指針數組與數組指針
楚河漢界
GacUI 動畫系統 (3:漸變動畫)

TAG:Python | 多線程 | 編程 |