Python threading多線程編程實(shí)例
Python 的多線程有兩種實(shí)現(xiàn)方法:
函數(shù),線程類
1.函數(shù)
調(diào)用 thread 模塊中的 start_new_thread() 函數(shù)來創(chuàng)建線程,以線程函數(shù)的形式告訴線程該做什么
# -*- coding: utf-8 -*-
import thread
def f(name):
#定義線程函數(shù)
print "this is " + name
if __name__ == '__main__':
thread.start_new_thread(f, ("thread1",))
#用start_new_thread()調(diào)用線程函數(shù)和其他參數(shù)
while 1:
pass
不過這種方法暫時(shí)沒能找到其他輔助方法,連主線程等待都要用 while 1 這種方法解決。
2.線程類
調(diào)用 threading 模塊,創(chuàng)建 threading.Thread 的子類來得到自定義線程類。
# -*- coding: utf-8 -*-
import threading
class Th(threading.Thread):
def __init__(self, name):
threading.Thread.__init__(self)
self.t_name = name
#調(diào)用父類構(gòu)造函數(shù)
def run(self):
#重寫run()函數(shù),線程默認(rèn)從此函數(shù)開始執(zhí)行
print "This is " + self.t_name
if __name__ == '__main__':
thread1 = Th("Thread_1")
thread1.start()
#start()函數(shù)啟動(dòng)線程,自動(dòng)執(zhí)行run()函數(shù)
threading.Thread 類的可繼承函數(shù):
getName() 獲得線程對(duì)象名稱
setName() 設(shè)置線程對(duì)象名稱
join() 等待調(diào)用的線程結(jié)束后再運(yùn)行之后的命令
setDaemon(bool) 阻塞模式, True: 父線程不等待子線程結(jié)束, False 等待,默認(rèn)為 False
isDaemon() 判斷子線程是否和父線程一起結(jié)束,即 setDaemon() 設(shè)置的值
isAlive() 判斷線程是否在運(yùn)行
實(shí)例
import threading
import time
class Th(threading.Thread):
def __init__(self, thread_name):
threading.Thread.__init__(self)
self.setName(thread_name)
def run(self):
print "This is thread " + self.getName()
for i in range(5):
time.sleep(1)
print str(i)
print self.getName() + "is over"
join() 阻塞等待
if __name__ == '__main__':
thread1 = Th("T1 ")
thread1.start()
#thread1.join()
print "main thread is over"
不帶 thread1.join() ,得到如下結(jié)果:
This is thread T1
main thread is over
0
1
2
T1 is over
不等待 thread1 完成,執(zhí)行之后語句。
加了 thread1.join() ,得到如下結(jié)果:
This is thread T1
0
1
2
T1 is over
main thread is over
阻塞等待 thread1 結(jié)束,才執(zhí)行下面語句
主線程等待
if __name__ == '__main__':
thread1 = Th("T1 ")
thread1.setDaemon(True)
#要在線程執(zhí)行之前就設(shè)置這個(gè)量
thread1.start()
print "main thread is over"
報(bào)錯(cuò): Exception in thread T1 (most likely raised during interpreter shutdown):
也就是主線程不等待子線程就結(jié)束了。
多個(gè)子線程
if __name__ == '__main__':
for i in range(3):
t = Th(str(i))
t.start()
print "main thread is over"
這里的 t 可同時(shí)處理多個(gè)線程,即 t 為線程句柄,重新賦值不影響線程。
這里奇怪的是,運(yùn)行 t.run() 時(shí),不會(huì)再執(zhí)行其他線程。雖不明,還是用 start() 吧。暫且理解為 start() 是非阻塞并行的,而 run 是阻塞的。
線程鎖
threading 提供線程鎖,可以實(shí)現(xiàn)線程同步。
import threading
import time
class Th(threading.Thread):
def __init__(self, thread_name):
threading.Thread.__init__(self)
self.setName(thread_name)
def run(self):
threadLock.acquire()
#獲得鎖之后再運(yùn)行
print "This is thread " + self.getName()
for i in range(3):
time.sleep(1)
print str(i)
print self.getName() + " is over"
threadLock.release()
#釋放鎖
if __name__ == '__main__':
threadLock = threading.Lock()
#設(shè)置全局鎖
thread1 = Th('Thread_1')
thread2 = Th('Thread_2')
thread1.start()
thread2.start()
得到結(jié)果:
This is thread Thread_1
0
1
2
Thread_1 is over
This is thread Thread_2
0
1
2
Thread_2 is over
相關(guān)文章
django 擴(kuò)展user用戶字段inlines方式
這篇文章主要介紹了django 擴(kuò)展user用戶字段inlines方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03
python?requests實(shí)現(xiàn)上傳excel數(shù)據(jù)流
這篇文章主要介紹了python?requests實(shí)現(xiàn)上傳excel數(shù)據(jù)流,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
Python爬取YY評(píng)級(jí)分?jǐn)?shù)并保存數(shù)據(jù)實(shí)現(xiàn)過程解析
這篇文章主要介紹了Python爬取YY評(píng)級(jí)分?jǐn)?shù)并保存數(shù)據(jù)實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
python傳到前端的數(shù)據(jù),雙引號(hào)被轉(zhuǎn)義的問題
這篇文章主要介紹了python傳到前端的數(shù)據(jù),雙引號(hào)被轉(zhuǎn)義的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-04-04
Python制作動(dòng)態(tài)字符圖的實(shí)例
今天小編就為大家分享一篇關(guān)于Python制作動(dòng)態(tài)字符圖的實(shí)例,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-01-01
python 字典(dict)遍歷的四種方法性能測(cè)試報(bào)告
本文主要是針對(duì)Python的字典dict遍歷的4種方法進(jìn)行了性能測(cè)試,以便分析得出效率最高的一種方法2014-06-06

