進程與線程 -- 多線程

  • 進程是由若干線程組成的,一個進程至少有一個線程
  • 多任務可以由多進程完成,也可以由一個進程內的多線程完成。
  • Python的線程是真正的Posix Thread,而不是模擬出來的線程。
為什么使用多線程
  • 多進程和多線程都可以完同時執行多任務的功能
  • 創建進程的系統開銷非常大,是一種重量級的多任務方式
  • 進程間的內存空間是相互獨立的,數據不能共享
  • 線程屬性某個進程,創建線程的系統開銷比較小,是一種輕量級的多任務方式
  • 線程間共享所屬進程的內存空間,數據可以共享
threading模塊

Python提供了兩個線程模塊:_threadthreading

  • _thread是低級模塊
  • threading是高級模塊(推薦使用)
使用threading模塊中的Thread類
  • 實例演示
import time, threading

def loop():  # 新線程執行的代碼
    print('thread %s is running...' % threading.current_thread().name)
    n = 0
    while n < 5:
        n = n + 1
        print('thread %s >>> %s' % (threading.current_thread().name, n))
        time.sleep(1)
    print('thread %s ended.' % threading.current_thread().name)

print('thread %s is running...' % threading.current_thread().name)
t = threading.Thread(target=loop, name='LoopThread')
t.start()
t.join()
print('thread %s ended.' % threading.current_thread().name)
thread MainThread is running...
thread LoopThread is running...
thread LoopThread >>> 1
thread LoopThread >>> 2
thread LoopThread >>> 3
thread LoopThread >>> 4
thread LoopThread >>> 5
thread LoopThread ended.
thread MainThread ended.
  • 任何進程都默認啟動一個線程,稱為主線程,主線程可以啟動子線程
  • current_thread()函數,返回當前線程名,主線程名為MainThread
  • 子線程名在創建時指定,如不指將自動命名為Thread-1,Thread-2
查看線程數量
import threading
from time import sleep,ctime

def sing():
    for i in range(3):
        print("正在唱歌...%d"%i)
        sleep(1)

def dance():
    for i in range(3):
        print("正在跳舞...%d"%i)
        sleep(1)

if __name__ == '__main__':
    print('---開始---:%s'%ctime())

    t1 = threading.Thread(target=sing)
    t2 = threading.Thread(target=dance)

    t1.start()
    t2.start()

    while True:
        length = len(threading.enumerate())
        print('當前運行的線程數為:%d'%length)
        if length<=1:
            break

        sleep(0.5)
---開始---:Mon Jan  7 22:49:59 2019
正在唱歌...0
正在跳舞...0
當前運行的線程數為:3
當前運行的線程數為:3
正在跳舞...1
正在唱歌...1
當前運行的線程數為:3
當前運行的線程數為:3
當前運行的線程數為:3
正在唱歌...2
正在跳舞...2
當前運行的線程數為:3
當前運行的線程數為:3
當前運行的線程數為:1
線程的封裝

為了體現封裝性,使用threading模塊時,通常會定義一個子類,讓它繼承自threading.Thread類,并重寫run方法

import threading
import time

class MyThread(threading.Thread):
    def run(self):
        for i in range(3):
            time.sleep(1)
            msg = "I'm "+self.name+' @ '+str(i)  #name屬性中保存當前線程名
            print(msg)

if __name__ == '__main__':
    t = MyThread()
    t.start()
I'm Thread-1 @ 0
I'm Thread-1 @ 1
I'm Thread-1 @ 2
  • threading.Thread類中的run方法,用于定義線程的功能函數,可以在自己的線程類中進行重寫
  • Thread類的start方法執行后,會在線程獲得運行資源時調用run方法
  • 如果直接調用run方法,并不能啟多線程,而僅僅是一個單線程的程序
課堂練習

實現多線程版的素數計算

import threading

class MyThread(threading.Thread):
    def __init__(self, beg, end):  # 通過類的構造方法進行參數據傳遞
        super(MyThread, self).__init__()  # 要調用父類的構造方法來進行初始化
        self.__beg = beg
        self.__end = end

    def __isPrime(self, n):  # 可以將某些處理函數變為私有方法
        for x in range(2, n):
            if n % x == 0:
                return False
        else:
            return True

    def run(self):  # 方法名不能改變,只重寫
        for n in range(self.__beg, self.__end):
            if self.__isPrime(n):
                print('%s:%d是素數' % (threading.current_thread().name, n))


if __name__ == '__main__':
    t1 = MyThread(3, 1001)
    t2 = MyThread(1001, 2001)
    t3 = MyThread(2001, 3001)

    t1.start()
    t2.start()
    t3.start()

    # t1.run()  # 如果直接調用run方法,并不能啟多線程,而僅僅是一個單線程的程序
    # t2.run()
    # t3.run()




- end -

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,578評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,701評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,691評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,974評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,694評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,026評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,015評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,193評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,719評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,442評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,668評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,151評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,846評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,255評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,592評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,394評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380