線程threading和進程multiprocessing模塊

一、線程模塊threading

Python提供了兩個有關多線程的標準庫,thread和threading。thread提供了低級別的,原始的線程和一個鎖。threading則是一個高級模塊,提供了對thread的封裝。建立新的線程有兩種方法:python

Thread類的構造方法:

__init__(group=None, target=None, name=None, args=(), kwargs=None, verbose=None)
參數說明:
group:線程組,目前尚未實現,庫引用中提示必須是None。
target:要執行的方法;
name:線程名;
args/kwargs:要傳入方法的參數。

 Thread類擁有的實例方法:

isAlive():返回線程是否在運行。正在運行指的是啓動後,終止前。 
getName(name)/setName(name):獲取/設置線程名。 
isDaemon(bool)/setDaemon(bool):獲取/設置是否爲守護線程。初始值從建立該線程的線程繼承而來,當沒有非守護線程仍在運行時,程序將終止。 
start():啓動線程。
join([timeout]):阻塞當前上下文環境的線程,直到調用此方法的線程終止或到達指定的等待時間timeout(可選參數)。即當前的線程要等調用join()這個方法的線程執行完,或者是達到規定的時間。

方法一:直接建立threading.Thread類的對象,初始化時將可調用對象做爲參數傳入。多線程

注意:併發

t = Thread(target = run, args = ("this is a", "thread"))
這句只是建立了一個線程,並未執行這個線程,此時線程處於新建狀態。
t.start()#啓動線程
啓動線程,此時線程仍未運行,只是處於準備狀態。

 
方法二:經過繼承Thread類,重寫它的__init__()方法和run方法。函數

因爲建立了兩個併發執行的線程t1和t2,併發線程的執行時間不定,誰先執行完的時間也不定,因此執行後打印的結果順序也是不定的。每一次執行都有可能出現不一樣的結果。this

注意:spa

繼承Thread類的新類MyThread構造函數中必需要調用父類的構造方法,這樣才能產生父類的構造函數中的參數,才能產生線程所須要的參數。新的類中若是須要別的參數,直接在其構造方法中加便可。
同時,新類中,在重寫父類的run方法時,它默認是不帶參數的,若是須要給它提供參數,須要在類的構造函數中指定,由於在線程執行的過程當中,run方法時線程本身去調用的,不用咱們手動調用,因此無法直接給傳遞參數,只能在構造方法中設定好參數,而後再run方法中調用。

二、multiprocessing模塊

線程multiprocessing模塊與進程使用的同一模塊。使用方法也基本相同,惟一不一樣的是,from multiprocessing import Pool這樣導入的Pool表示的是進程池;
from multiprocessing.dummy import Pool這樣導入的Pool表示的是線程池。這樣就能夠實現線程裏面的併發了。
線程池示例:
進程池示例:
from multiprocessing import Pool

def f(x):
    return x*x

if __name__ == '__main__':
    with Pool(5) as p:
        print(p.map(f, [1, 2, 3]))

結果輸出:[1, 4, 9]

在multiprocessing中,經過建立Process對象,而後調用其start()方法來生成進程。線程

from multiprocessing import Process
import os

def info(title):
    print(title)
    print('module name:', __name__)
    print('parent process:', os.getppid())
    print('process id:', os.getpid())

def f(name):
    info('function f')
    print('hello', name)

if __name__ == '__main__':
    info('main line')
    p = Process(target=f, args=('bob',))
    p.start()
    p.join()
相關文章
相關標籤/搜索