1、在使用python多線程以前,你須要知道的。python
python的多線程中,實現併發是沒有問題的,可是!!是沒法實現真正的並行的。
多線程
這是由於python內部有個GIL鎖(全局解釋器鎖),這個鎖限制了在同一時刻,同一個進程中,只能有一個線程被運行!!!併發
2、threading模塊的基本使用方法。python2.7
可使用它來建立線程。有兩種方式來建立線程。ide
一、經過繼承Thread類,重寫它的run方法。函數
二、建立一個threading.Thread對象,在它的初始化函數__init__中將可調用對象做爲參數傳入。線程
三、接下來演示下這兩種建立線程對象的方法。對象
經過繼承Thread類的方式建立線程。繼承
#!/usr/local/bin/python2.7進程
# -*- coding:utf-8 -*-
import threading
import time
class Mythread(threading.Thread):
def __init__(self,num):
threading.Thread.__init__(self)
self.num = num
def run(self):
print "running number %s" %(self.num)
time.sleep(3)
t1 = Mythread(1111111)
t2 = Mythread(2222222)
t1.start() #調用線程對象的start方法,類中的run方法就會被執行!!!!
t2.start()
print "ending"
2.建立一個threading.Thread對象,在實例化對象時調用構造方法來建立線程。
import threading
import time
def print_num(num):
print "running num is %s" %(num)
time.sleep(3)
print "running num is %s over!!!!" %(num)
if __name__ == "__main__":
t1 = threading.Thread(target=print_num,args=(111111,)) #建立線程對象
t2 = threading.Thread(target=print_num,args=(222222,)) #建立線程對象。
t1.start() #運行線程對象
t2.start()
print "ending"
#當前執行的python程序是一個主線程,在程序中執行的兩個線程就是子線程。
3、關於線程對象的一些經常使用方法。
join()執行了線程的join方法後,在子線程運行結束以前,父線程會被一直阻塞。
import threading
import time
def listen_music(name):
print "begin listenning to %s.%s" %(name,time.ctime())
time.sleep(3)
print "end listenning time %s" %(time.ctime())
def play_game(name):
print "play %s time %s " %(name,time.ctime())
time.sleep(8)
print "end playing"
thread_list = []
t1 = threading.Thread(target=listen_music,args=("mirrorcle world",))
t2 = threading.Thread(target=play_game,args=("Virtual stalker",))
t1.start()
t1.join() #當t1沒有執行完以前,父線程會被阻塞,直到t1執行結束後,主線程(主程序)的代碼纔會繼續執行。
t2.start()
t2.join() #當t2沒有執行完以前,父線程會被阻塞,直到t2執行結束後主線程(主程序)的代碼纔會繼續執行。
print "ending......."
2.setdeamon()設置守護線程。
首先先來了解下守護線程的概念。
咱們用python寫的程序,在運行的過程當中,會開啓一個主線程,若是這個主線程開啓了一個子線程,主線程和子線程會兵分兩路,分別運行。
默認狀況下,當咱們的python程序運行結束,準備退出的時候,會校驗子線程是否運行完畢,若是子線程沒有運行完畢,主線程會等待子線程運行完畢後,在退出,這是默認狀況。
假如,咱們如今有一種需求,只須要主線程運行結束後,無論子線程是否運行結束,都要和主線程一塊兒結束,這就是守護線程的概念。
import threading
import time
def listen_music(name):
print "begin listenning to %s.%s" %(name,time.ctime())
time.sleep(3)
print "end listenning time %s" %(time.ctime())
def play_game(name):
print "play %s time %s " %(name,time.ctime())
time.sleep(8)
print "end playing"
thread_list = []
t1 = threading.Thread(target=listen_music,args=("mirrorcle world",))
t2 = threading.Thread(target=play_game,args=("Virtual stalker",))
t1.setDaemon(True) #守護線程必定要設置在start以前!!!
t1.start()
t2.setDaemon(True)
t2.start()
print "ending......."
運行結果:
begin listenning to mirrorcle world.Thu May 11 10:26:23 2017
play Virtual stalker time Thu May 11 10:26:23 2017
ending.......
從結果中能夠看出兩個線程的內容並無被執行完!主線程執行結束後,子線程也跟着結束了!
4、關於線程對象的一些其餘方法。
isAlive() 用來判斷一個線程是否處於活動狀態。
getName() 返回這個線程的線程名稱。
setName()設置一個線程的名稱。
threading 模塊提供的一些函數:
threading.currentThread()返回當前線程對象。
threading.enumerate() 將當前python程序中正在運行的線程對象,以列表的形式返回。
threading.activeCount() 返回當前運行的線程數量。