首先了解一下單執行緒,在啊很多年前的ms -dos時代,作業系統處理問題都是單任務的,我想做聽**和看電影兩件事兒,那麼一定要先排一下順序。
from time import ctime,sleep
defmusic
():for i in range(2):
print
"i was listening to music. %s" %ctime()
sleep(1)
defmove
():for i in range(2):
print
"i was at the movies! %s" %ctime()
sleep(5)
if __name__ == '__main__':
music()
move()
print
"all over %s" %ctime()
#coding=utf-8
from time import ctime,sleep
defmusic
(func):
for i in range(2):
print
"i was listening to %s. %s" %(func,ctime())
sleep(1)
defmove
(func):
for i in range(2):
print
"i was at the %s! %s" %(func,ctime())
sleep(5)
if __name__ == '__main__':
music(u'今生你作伴')
move(u'阿凡達')
print
"all over %s" %ctime()
對music()和move()進行了傳參處理。體驗中國經典歌曲和歐美大片文化。
執行結果:
下面我們重點了解多執行緒是怎麼回事,科技在發展,時代在進步,我們的cpu也越來越快,cpu抱怨,p大點事兒佔了我一定時間,其實我同時幹多個活都沒有問題的;於是,作業系統就進入了多工時代。我們聽著**吃著火鍋的不再是夢想。
python提供了兩個模組來實現多執行緒thread 和threading ,thread 有一些缺點,在threading 得到了彌補,為了不浪費你和時間,所以我們直接學習threading 就可以了。
#coding=utf-8
import threading
from time import ctime,sleep
defmusic
(func):
for i in range(2):
print
"i was listening to %s. %s" %(func,ctime())
sleep(1)
defmove
(func):
for i in range(2):
print
"i was at the %s! %s" %(func,ctime())
sleep(5)
threads =
t1 = threading.thread(target=music,args=(u'愛情買賣',))
t2 = threading.thread(target=move,args=(u'阿凡達',))
if __name__ == '__main__':
for t in threads:
t.setdaemon(true)
t.start()
print
"all over %s" %ctime()
import threading
首先匯入threading模組,這是使用多執行緒的前提
threads =
t1 = threading.thread(target=music,args=(u'今生你作伴',))
建立了threads陣列,建立執行緒t1,使用threading.thread()方法,在這個方法中呼叫music方法target=music,args方法對music進行傳參。 把建立好的執行緒t1裝到threads陣列中。
接著以同樣的方式建立執行緒t2,並把t2也裝到threads陣列。
for t in threads:最後通過for迴圈遍歷陣列。(陣列被裝載了t1和t2兩個執行緒)t.setdaemon(true)
t.start()
setdaemon()
setdaemon(true)將執行緒宣告為守護執行緒,必須在start() 方法呼叫之前設定,如果不設定為守護執行緒程式會被無限掛起。子執行緒啟動後,父執行緒也繼續執行下去,當父執行緒執行完最後一條語句print 「all over %s」 %ctime()後,沒有等待子執行緒,直接就退出了,同時子執行緒也一同結束。
start()
開始執行緒活動
從執行結果來看:
子執行緒(muisc 、move )和主線程(print 「all over %s」 %ctime())都是同一時間啟動,但由於主線程執行完結束,所以導致子執行緒也終止。
對上述程式稍作修改:
if __name__ == '__main__':
for t in threads:
t.setdaemon(true)
t.start()
t.join()
print
"all over %s"
%ctime()
我們只對上面的程式加了個join()方法,用於等待執行緒終止。join()的作用是,在子執行緒完成執行之前,這個子執行緒的父執行緒將一直被阻塞。
注意: join()方法的位置是在for迴圈外的,也就是說必須等待for迴圈裡的兩個程序都結束後,才去執行主程序。
從上面例子中發現執行緒的建立是頗為麻煩的,每建立乙個執行緒都需要建立乙個tx(t1、t2、…),如果建立的執行緒多時候這樣極其不方便。下面對通過例子進行繼續改進:
#coding=utf-8
from time import sleep, ctime
import threading
defsuper_player
(file,time):
for i in range(2):
print
'start playing: %s! %s' %(file,ctime())
sleep(time)
list =
threads =
files = range(len(list))
#建立執行緒
for file,time in list.items():
t = threading.thread(target=super_player,args=(file,time))
if __name__ == '__main__':
#啟動執行緒
for i in files:
threads[i].start()
for i in files:
threads[i].join()
#主線程
print
'end:%s' %ctime()
最後是執行緒啟動執行。執行結果:
建立自己的多執行緒類
#coding=utf-8
import threading
from time import sleep, ctime
class
mythread
(threading.thread):
def__init__
(self,func,args,name=''):
threading.thread.__init__(self)
self.name=name
self.func=func
self.args=args
defrun(self):
defsuper_play
(file,time):
for i in range(2):
print
'start playing: %s! %s' %(file,ctime())
sleep(time)
list =
#建立執行緒
threads =
files = range(len(list))
for k,v in list.items():
t = mythread(super_play,(k,v),super_play.__name__)
if __name__ == '__main__':
#啟動執行緒
for i in files:
threads[i].start()
for i in files:
threads[i].join()
#主線程
print
'end:%s' %ctime()
深入學習才會有意想不到的收穫,繼續努力,加油~ Python多執行緒學習
一 建立執行緒 1 通過thread模組中的start new thread func,args 建立執行緒 在eclipse pydev中敲出以下 coding utf 8 import thread def run thread n for i in range n print i thread...
python學習 多執行緒
示例 import threading import time def stuthread arg1,arg2 print threading.current thread getname 開始執行 print 引數為 s s arg1,arg2 time.sleep 1 暫停1s print th...
python學習 多執行緒
死鎖概念 程式執行的最小單元,依賴於程序 特點 建立 threading模組thread類建立乙個物件 import threading t threading.thread target 函式名,args 引數 t.start 互斥鎖 建立 threading模組lock類建立乙個物件import...